Java
Zaman makinesi yaklaşımını almaya karar verdim. Bir zaman makinesinin anahtar bileşeninin java.awt.Robot olduğu ortaya çıktı. Programım farenizi 10 saniye boyunca hareket ettirmenizi sağlar. 10 saniye sonra, zamanda geriye gider ve fare hareketini yeniden yaratırken mükemmel bir şekilde tahmin eder.
İşte kod:
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);
}
}