Animation

julian.veh

Bekanntes Mitglied
Wahrscheinlich eine blöde Frage. Ich will gerade ein kleines Spiel erstellen. Meine Figur zieht aber eine Spur hinter sich her. Habe nicht nach einem festen Tutorial gearbeitet, da ich es vorziehe mir etwas durchzulesen und es hinterher selbst umzusetzen. Sonst erwische ich mich nämlich immer wieder selbst dabei, nur den Code abzuschreiben ^^.

Java:
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;



public class SpielPanel extends JPanel implements Runnable {
    
    private JFrame frame;
    private Thread thread;
    private Image maennchen = Toolkit.getDefaultToolkit().getImage("maennchen.png");
    int x_pos = 10;
    int y_pos = 10;
    
    Image dbImage;
    Graphics dbg;
    
    public SpielPanel(int w, int h) {
        this.setPreferredSize(new Dimension(w, h));
        this.frame = new JFrame("Game");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setVisible(true);
        run();
    }
    
    private void start() {
        this.thread = new Thread(this);
        thread.start();
    }
    
    @Override
    public void run() {
        while(frame.isVisible()){
            doLogic();
            x_pos++;
            this.repaint();
            try {
                thread.sleep(10);
            } catch(InterruptedException e) {
            }
        }
    }
    
    @Override
    public void paint(Graphics g) {
        g.drawImage(maennchen, x_pos, y_pos, null);
    }
    
    public void doLogic() {
        
    }
    
    public void update(Graphics g) {
        if(dbImage == null) {
            dbImage = createImage(this.getSize().width, this.getSize().height);
            dbg = dbImage.getGraphics();
        }
        dbg.setColor(getBackground());
        dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
        dbg.setColor(getForeground());
        paint(dbg);
        g.drawImage(dbImage, 0, 0 ,this);
    }
    
    public static void main (String[] args) {
        new SpielPanel(400, 300);
    }
}

ich dachte mit der Methode repaint() wird alles gelöscht und wieder gemalt?

Hoffentlich kann mir jemand helfen
Grüße 😉
 
Du benutzt Swing ( indem du JFrame und JPanel benutzt), hier brauchst du dich nicht selbst um Doublebuffering kümmern (der Code in update )

So, da du Swing benutzt heißt die Zeichen-methode paintComponent(Graphics g), am anfang dieser sollte super.paintComponent(g) aufgerufen werden, warum das genau so ist findest du mit ein bisschen googlen selbst herraus.
 
Ok. Wenigstens habe ich es jetzt verstanden. ^^ liegt wohl daran, dass das was ich mir durchgelesen habe für Applets war und ich die Hälfte nicht verstanden habe.

Danke 😉
 
Das ist zufälligerweise der Effekt. Aber super.paintComponent ruft nur die paintComponent vom JPanel auf.

Würdest du von JComponent erben, würde nichts passieren.

So schwer ist das nicht, zu sagen, dass der Hintergrund übermalt werden soll. Ich geb dir einen Tipp: [Japi]Graphics#fillRect(int, int, int, int)[/japi]
 

Neue Themen


Zurück
Oben