Simple Animation mit Swing

Hag2bard

Bekanntes Mitglied
Ich versuche gerade eine simple Animation mit Swing zu erstellen, aber ich weiß leider nicht mehr weiter.

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

public class Canvas extends JPanel implements KeyListener {
    
    private int positionX = 64;
    private int positionY = 64;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(tilesetBufferedImage, positionX, positionY, positionX + 32, positionY + 32, 3 * TILESIZE, 3 * TILESIZE, 4 * TILESIZE, 4 * TILESIZE, null);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            animate();
            repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    private void animate(){
        for (int i = 0; i < 17; i++) {
            positionX++;
            repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


Ich hab den Code jetzt mal aufs nötigste herunter gebrochen.
Mein Problem ist, dass er die Figur direkt um 16 Pixel bewegt und er auch 16*50ms wartet, bevor er dies macht.
Ich weiß nicht mehr genau wie man dieses Problem löst.

Habt ihr eine Idee?
 
Swing hat die Eigenschaft, dass der Bildschirm erst aktualisiert wird, wenn der aktuelle Thread beencdet ist, bzw. wenn alles in der Methode des Eventhandlers ausgeführt wurde - egal wie oft du darin repaint() oder validate() oder was auch immer aufrufsst. Anonsten würde z.B. - wenn du den Text von 5 Labels änderst - nach jedem Label neu gezeichnet.

Du musst den Code, der für die Animation zuständig ist, in einen eigenen Thread auslagern, getrennt vom Eventhandler.
Dafür gibt's z.B. SwingWorker, aber in diesem Fall dürfte ein Einfacher Thread ebenso zum Ziel führen.
 

Neue Themen


Zurück
Oben