Hi Java Forum,
mein Problem ist, dass ich bei Zeichnen einer sich bewegenden Box auf ein JFrame eine Spur hinterlasse mit den alten Positionen der Box. Die Box lasse ich mit einer bestimmten Geschwindigkeit auf den Mauszeiger zusteuern. Die Box folgt auch dem Mauszeiger, zieht dabei aber eine Spur:
Ich nutze eine BufferStrategy zum zwischenspeichern der Frames. Die paintComponent Methode wird vom BearbeitungsThread des Programms ca. alle 16 Millisekunden aufgerufen. Hier ein stark vereinfachter und gekürzter Quelltextauszug:
Die X- und Y-Koordinaten lasse ich ausgeben und sie entsprechen den erwarteten Werten:
Eine Sache die ich festgestellt habe, als ich versucht hab die paint(Graphics g) Methode der Component zu überschreiben ist, dass diese nur 0-4 mal aufgerufen wird und dann nicht mehr. Ich weiß nicht, ob das etwas damit zu tun hat, klingt aber so als könnte es dort einen Zusammenhang geben.
Ich hoffe, dass dies ein bekanntes Problem ist und schnell jemand eine Lösung findet. Ich bedanke mich schon einmal im voraus.
Grüße,
Atlan aka Luca
mein Problem ist, dass ich bei Zeichnen einer sich bewegenden Box auf ein JFrame eine Spur hinterlasse mit den alten Positionen der Box. Die Box lasse ich mit einer bestimmten Geschwindigkeit auf den Mauszeiger zusteuern. Die Box folgt auch dem Mauszeiger, zieht dabei aber eine Spur:

Ich nutze eine BufferStrategy zum zwischenspeichern der Frames. Die paintComponent Methode wird vom BearbeitungsThread des Programms ca. alle 16 Millisekunden aufgerufen. Hier ein stark vereinfachter und gekürzter Quelltextauszug:
Java:
public class GFrame extends JFrame {
public static final int HEIGHT = 600, WIDTH = 1200;
private BufferStrategy strat;
private PlayerEntity player;
public GFrame(PlayerEntity player) {
super();
this.player = player;
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(WIDTH, HEIGHT);
this.setLocationRelativeTo(null);
this.setBackground(Color.BLACK);
this.setVisible(true);
this.createBufferStrategy(2);
this.strat = getBufferStrategy();
}
// Stark vereinfachter aufbau der Methode
public void paintObjects() {
Graphics g = strat.getDrawGraphics();
g.setColor(player.getColor());
g.fillRect((int) player.getXPos(), (int) player.getYPos(), player.getWidth(),
player.getHeight());
g.dispose();
strat.show();
}
}
Java:
public class GameThread implements Runnable {
@Override
public void run() {
//Gekürzt
while (running) {
timePast = System.currentTimeMillis() - cycleStartTime;
cycleStartTime = System.currentTimeMillis();
this.gameFrame.getPlayer().updatePosition(timePast);
gameFrame.paintObjects();
try { if (1000 - timePast > 0) Thread.sleep((1000 - timePast) / FRAMES_PER_SECOND);
} catch (InterruptedException e) {e.printStackTrace();}
}
}
}
Die X- und Y-Koordinaten lasse ich ausgeben und sie entsprechen den erwarteten Werten:
Code:
50.0 - 50.0
65.970894 - 49.035316
81.93143 - 50.158432
97.713776 - 52.78856
113.24655 - 56.6269
128.48276 - 61.51139
usw.
Eine Sache die ich festgestellt habe, als ich versucht hab die paint(Graphics g) Methode der Component zu überschreiben ist, dass diese nur 0-4 mal aufgerufen wird und dann nicht mehr. Ich weiß nicht, ob das etwas damit zu tun hat, klingt aber so als könnte es dort einen Zusammenhang geben.
Java:
@Override
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.setColor(player.getColor());
g.fillRect((int) player.getXPos(), (int) player.getYPos(), player.getWidth(),
player.getHeight());
g.dispose();
}
Ich hoffe, dass dies ein bekanntes Problem ist und schnell jemand eine Lösung findet. Ich bedanke mich schon einmal im voraus.
Grüße,
Atlan aka Luca