Hi,
ich hab noch eine Frage zu dem ganzen Graphicszeug. Und zwar möchte ich auf Knopfdruck eine Ellipse verschieben, ohne dass diese sofort dorthin spring, sondern eben dorthin "fließt". Dabei denke ich an die Animation von Pacman, der von Zelle zu Zelle "läuft" und eben nicht auf einmal in einer Zelle verschwindet und in der nächsten Zelle wieder auftaucht.
Das hab ich im Moment so umgesetzt, dass bei Tastendruck ein Timer mit 10ms delay gestartet wird und er so die Position x um 1 vergrößert, bis sie insgesamt um zB 50 Pixel verschoben wurde. Jetzt kommt mir das sehr umständlich und auch ziemlich hässlich vor. Wird das denn "normalerweise" auch so gemacht, oder gibts da vielleicht Sachen in JavaFX? Oder nimmt man da eigtl. ein animiertes .gif?
Hier mal der Code vom Listener:
[JAVA=89]class MyListener implements ActionListener {
Test caller;
int i;
int dir;
javax.swing.Timer timer;
public MyListener(Test o) {
this.caller = o;
i = 0;
timer = new javax.swing.Timer(10, this);
}
public void actionPerformed(ActionEvent evt) {
Object obj = evt.getSource();
if (obj.equals(caller.button1)) {
if (caller.pane.y >= 10) {
i = 0;
dir = 0;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button2)) {
if (caller.pane.x <= 290) {
i = 0;
dir = 1;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button3)) {
if (caller.pane.y <= 290) {
i = 0;
dir = 2;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button4)) {
if (caller.pane.x >= 10) {
i = 0;
dir = 3;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(timer)) {
if (i == 50) {
timer.stop();
toggleButtons(true);
} else {
if (dir == 0) {
caller.pane.y--;
} else if (dir == 1) {
caller.pane.x++;
} else if (dir == 2) {
caller.pane.y++;
} else if (dir == 3) {
caller.pane.x--;
}
i++;
}
}
caller.label.setText(caller.pane.x + ", " + caller.pane.y);
caller.frame.repaint();
}
public void toggleButtons(boolean b) {
caller.button1.setEnabled(b);
caller.button2.setEnabled(b);
caller.button3.setEnabled(b);
caller.button4.setEnabled(b);
}
}[/code]
ich hab noch eine Frage zu dem ganzen Graphicszeug. Und zwar möchte ich auf Knopfdruck eine Ellipse verschieben, ohne dass diese sofort dorthin spring, sondern eben dorthin "fließt". Dabei denke ich an die Animation von Pacman, der von Zelle zu Zelle "läuft" und eben nicht auf einmal in einer Zelle verschwindet und in der nächsten Zelle wieder auftaucht.
Das hab ich im Moment so umgesetzt, dass bei Tastendruck ein Timer mit 10ms delay gestartet wird und er so die Position x um 1 vergrößert, bis sie insgesamt um zB 50 Pixel verschoben wurde. Jetzt kommt mir das sehr umständlich und auch ziemlich hässlich vor. Wird das denn "normalerweise" auch so gemacht, oder gibts da vielleicht Sachen in JavaFX? Oder nimmt man da eigtl. ein animiertes .gif?
Hier mal der Code vom Listener:
[JAVA=89]class MyListener implements ActionListener {
Test caller;
int i;
int dir;
javax.swing.Timer timer;
public MyListener(Test o) {
this.caller = o;
i = 0;
timer = new javax.swing.Timer(10, this);
}
public void actionPerformed(ActionEvent evt) {
Object obj = evt.getSource();
if (obj.equals(caller.button1)) {
if (caller.pane.y >= 10) {
i = 0;
dir = 0;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button2)) {
if (caller.pane.x <= 290) {
i = 0;
dir = 1;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button3)) {
if (caller.pane.y <= 290) {
i = 0;
dir = 2;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button4)) {
if (caller.pane.x >= 10) {
i = 0;
dir = 3;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(timer)) {
if (i == 50) {
timer.stop();
toggleButtons(true);
} else {
if (dir == 0) {
caller.pane.y--;
} else if (dir == 1) {
caller.pane.x++;
} else if (dir == 2) {
caller.pane.y++;
} else if (dir == 3) {
caller.pane.x--;
}
i++;
}
}
caller.label.setText(caller.pane.x + ", " + caller.pane.y);
caller.frame.repaint();
}
public void toggleButtons(boolean b) {
caller.button1.setEnabled(b);
caller.button2.setEnabled(b);
caller.button3.setEnabled(b);
caller.button4.setEnabled(b);
}
}[/code]