Java
J'ai décidé d'adopter l'approche de la machine à remonter le temps. Il s'avère que l'ingrédient clé d'une machine à voyager dans le temps est java.awt.Robot. Mon programme vous permet de déplacer votre souris pendant 10 secondes. Après les 10 secondes, il remonte dans le temps et recrée le mouvement de votre souris, tout en le prédisant parfaitement.
Voici le code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class TimeMachine extends JPanel implements MouseMotionListener {
Timer timer;
int time = 10;
java.util.Timer taskTimer;
ArrayList<Point> mousePoints;
ArrayList<Long> times;
Robot robot;
int width, height;
ArrayList<Point> drawMousePoints;
public TimeMachine(){
width = 500;
height = 500;
drawMousePoints = new ArrayList<Point>();
robot = null;
try{
robot = new Robot();
}
catch(Exception e){
System.out.println("The time machine malfunctioned... Reverting to 512 BC");
}
mousePoints = new ArrayList<Point>();
times = new ArrayList<Long>();
taskTimer = new java.util.Timer();
ActionListener al = new ActionListener(){
public void actionPerformed(ActionEvent e){
time--;
if(time == 0)
rewind();
repaint();
}
};
timer = new Timer(1000, al);
start();
}
public void paint(Graphics g){
g.clearRect(0, 0, width, height);
g.drawString("Time Machine activiates in: " + time, 15, 50);
for(int i=0; i<drawMousePoints.size(); i++){
Point drawMousePoint = drawMousePoints.get(i);
drawMouse(drawMousePoint.x-getLocationOnScreen().x, drawMousePoint.y-getLocationOnScreen().y, g, Color.BLACK, Color.LIGHT_GRAY, (double)i/drawMousePoints.size());
}
}
public void drawMouse(int x, int y, Graphics g, Color line, Color fill, double alpha){
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(new Color(fill.getRed(), fill.getGreen(), fill.getBlue(), (int)Math.max(Math.min(alpha*255, 255), 0)));
g2d.fillPolygon(new int[]{x, x, x+4, x+8, x+10, x+7, x+12}, new int[]{y, y+16, y+13, y+20, y+19, y+12, y+12}, 7);
g2d.setColor(new Color(line.getRed(), line.getGreen(), line.getBlue(), (int)Math.max(Math.min(alpha*255, 255), 0)));
g2d.drawLine(x, y, x, y + 16);
g2d.drawLine(x, y+16, x+4, y+13);
g2d.drawLine(x+4, y+13, x+8, y+20);
g2d.drawLine(x+8, y+20, x+10, y+19);
g2d.drawLine(x+10, y+19, x+7, y+12);
g2d.drawLine(x+7, y+12, x+12, y+12);
g2d.drawLine(x+12, y+12, x, y);
}
public void start(){
timer.start();
prevTime = System.currentTimeMillis();
mousePoints.clear();
}
public void rewind(){
timer.stop();
long timeSum = 0;
for(int i=0; i<times.size(); i++){
timeSum += times.get(0);
final boolean done = i == times.size()-1;
taskTimer.schedule(new TimerTask(){
public void run(){
Point point = mousePoints.remove(0);
drawMousePoints.clear();
drawMousePoints.addAll(mousePoints.subList(0, Math.min(mousePoints.size(), 30)));
robot.mouseMove(point.x, point.y);
repaint();
if(done)
System.exit(0);
}
}, timeSum);
}
}
long prevTime = 0;
public void record(MouseEvent m){
if(timer.isRunning()){
long time = System.currentTimeMillis();
mousePoints.add(new Point(m.getXOnScreen(), m.getYOnScreen()));
times.add((time-prevTime)/10);
prevTime = time;
}
}
public static void main(String[] args){
TimeMachine timeMachine = new TimeMachine();
JFrame frame = new JFrame("Time Machine");
frame.setSize(timeMachine.width, timeMachine.height);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.addMouseMotionListener(timeMachine);
frame.add(timeMachine);
}
public void mouseDragged(MouseEvent m) {
record(m);
}
public void mouseMoved(MouseEvent m) {
record(m);
}
}