Java Probleme beim einbau einer Bufferstrategy in mein Pong Spiel

Zespire

Lieutenant
Registriert
März 2007
Beiträge
857
Grüße, ich bekomme es einfach nicht hin die BufferStrategy in mein kleines Pong spiel ein zu bauen.


Hier der Code von meinem Frame

Code:
public class Window extends JFrame implements KeyListener {

Image 	ball 	        = null;
	Image 	block 	= null;
	Image 	menu1 	= null;
	Image 	menu2 	= null;
	
	private BufferStrategy buffer;
	
	public Window() {
		super("Pong");
		
		//init
		addKeyListener(this);
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		setLayout(null);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		try {
			//load background
			setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("src/IMG/test.png")))));

			//load Images
			ball = (ImageIO.read(new File("src/IMG/ball.png")));
			block = (ImageIO.read(new File("src/IMG/balken.png")));
			menu1 = (ImageIO.read(new File("src/IMG/new_game.png")));
			menu2 = (ImageIO.read(new File("src/IMG/quit.png")));
		
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		pack();
		//set position 
		setBounds((screenSize.width / 2) - (getWidth() / 2),(screenSize.height / 2) - (getHeight() / 2),getWidth(), getHeight());
		
		//end
		setVisible(true);
		createBufferStrategy(2);
		buffer = getBufferStrategy();
		}
	
	
	
	public void draw(){
		
		Graphics g = buffer.getDrawGraphics();

		g.drawImage(block,Main.player.position_y-3,Main.player.position_x-3, null);
		g.drawImage(block,Main.computer.position_y-3,Main.computer.position_x-3, null);
		g.drawImage(ball, Main.ball.position_y - 5,Main.ball.position_x -5, null);
		
		
		if(Main.game_switch == false){
			
			if(Main.menu_switch == true){
				g.drawImage(menu1,203,150, null);
				
			}else{
				g.drawImage(menu2,203,150, null);}}
	
	
	
	}

Das ganze rufe ich meiner gameloop über frame.draw(); auf. Leider habe ich keine Idee wo ich den Fehler eingebaut habe.


Hier noch meine alte paint Methode mit der es funktioniert hat.
Code:
	public void paint(Graphics g){
		
		super.paint(g);
		g.drawImage(block,Main.player.position_y-3,Main.player.position_x-3, null);
		g.drawImage(block,Main.computer.position_y-3,Main.computer.position_x-3, null);
		g.drawImage(ball, Main.ball.position_y -5,Main.ball.position_x -5, null);
		
		if(Main.game_switch == false){
			
			
			if(Main.menu_switch == true){
				g.drawImage(menu1,203,150, null);
				
			}else{
				g.drawImage(menu2,203,150, null);
				
			}
		
		}
			
	}
 
Kann ich nicht beurteilen, da der wesentliche Code fehlt, in dem die Bufferstrategy initialisiert wird.
Eigentlich ist hier alles erklärt.

Anonsten lad mal ein .zip mit dem kompletten projekt hoch, dass man sich das richtig ansehen kann.
 
Hab es mal hochgeladen und initilaisiert wird sie in zeile 40 und 41.

(der KeyListener bleibt nicht so):mussweg:

[Edit]: Habe es noch einmal hochgeladen (pong2), wie ich es vor den Versuchen mit dem Buffer hatte.
Da kann man das Flackern sehr gut sehen wegen welchem ich den Buffer brauche...
 

Anhänge

Zuletzt bearbeitet:
Schau dir mal das Beispiel in der Doku an. Bei dir fehlt der Teil wo der buffer angezeigt wird, also ein buffer.show().
Die Prüfungen und das dispose würde ich auch in Erwägung ziehen. Man muss ja nicht unnötig ressourcen verbraten.
 
Wo du schonmal hier bist, ich empfehle dir das gebastele mit Thread.sleep durch Timer zu ersetzen.

java.util.Timer hat die schicke Methode scheduleAtFixedRate(), mit der man den Main loop regelmäßig aufrufen lassen kann. Damit bekommst du deine FPS sehr einfach stabil, ohne die komische Rechnerei und Blockiererei.
 
Warum denn so umständlich? Einfach auf ein JPanel zeichnen, was double buffering by default aktiv hat.

Timer sind für einen game loop wenig geeignet. So ein Konstrukt passt sich nicht an verschiedene Systemgeschwindigkeiten an, ist kompliziert zu pausieren und zu viel overhead im Vergleich zu einer flüssig durchlaufenden Schleife. Einen vernünftigen game loop zu implementieren ist gar nicht so einfach und man sollte sich dazu ordentlich einlesen. Das ist wesentlich wichtiger als Spielerei mit buffering.
 
Hatte mich hier http://www.java-gaming.org/index.php?topic=24220.0 über Gameloops schlau gemacht dort steht
"I won't bother laying out javax.swing.Timer, because it is totally suck. Don't use it!".
Ich kann jetzt nicht beurteilen wieso der Timer Müll ist, aber ich habe mich nach der Aussage an Thread.sleep gehalten.
 
Das schöne an Timern ist doch gerade die vorgegebene Taktung, unabhängig von der Systemgeschwindigkeit. Mein erstes Spiel mit GUI war auch ein Pong, und da habe ich mich auch mit sleep herumgeärgert. Das nächste war eine art Boulderdash clone. Da habe ich mit dem Timer das beste Ergebnis erzielt. Da es dabei auf das Timing ankommt, wenn man bestimmte fies gebaute Spielsituationen schaffen können möchte, war das Ideal.
Aber es kommt wohl generell auf die Art und komplexität des Spiels und die Fähigkeiten an was man verwenden sollte.

@Zespire
Der Satz den du zitierst bezieht sich auf den swing timer, nicht den util Timer. Jeder util timer hat einen eigenen Thread. Für Spiele ohne extrem rechenaufwändige Logik kann man den recht gut verwenden. Wenn es aber so wie du es jetzt hast funktioniert, dann lass es so. Ich hab's jetzt nicht im Detail durchdacht was da in dem code genau passiert, ich hab nur gesehen, dass du versuchst feste ausführungszeitpunkte zu erreichen.
 
Zurück
Oben