2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur

AtlanTK

Mitglied
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:

15752784ua.jpg


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
 
Du musst auch den hintergrund jedesmal neu zeichnen

Nach meiner erfahrung führt java fillrect schneller aus als clearrect, einfach mit der grösse deiner zeichenebene ausführen. Lg
 
Du musst auch den Hintergrund jedesmal neu zeichnen

Nach meiner Erfahrung führt java fillrect schneller aus als clearrect, einfach mit der Größe deiner Zeichenebene ausführen. Lg

Das verstehe ich nicht.
Du meinst ich soll über meinen alten Frame den neuen einfach drüber-pinseln? Führt das nicht zu einem enormen Speicherverlust durch alte Frames?
 

Zurück
Oben