Java DoubleBuffering PingPong-Problem

SoloMid

Grünschnabel
Hey Leute,

ich versuche mich gerade etwas an der Oberflächenprogrammierung mit Java (bzw. Eclipse) und wollte deshalb ein kleines PingPong Spiel programmieren.

Schlicht und einfach hau ich aufs JFrame nur nen Spielfeld rauf und darauf dann nen Ball. Als ich dabei war die Bewegung des Ball zu implementieren stellte ich fest, dass mein JFrame komplett anfängt zu flackern.

Nach etwas recherchieren kam ich aufs Thema DoubleBuffering und darauf, dass dies die Lösung zu meinem Problem sei.

Nur muss ich ehrlich sagen, bin ich relativ ratlos und habe keinen Ansatz wie ich das in meine Klasse implementieren könnte.

Hier wäre meine Klasse PingPong:

Code:
import javax.swing.*;
import java.awt.*;

public class PingPong extends JFrame implements Runnable {
	
	 private Ball ball = new Ball(485, 240, this);

//-----------------------------------------------------------------
	  
	  public void paint (Graphics g) {
	    
	    super.paint(g);
	    
	    g.drawImage(Toolkit.getDefaultToolkit().getImage("Spielfeld.png"), 0, 0, this);
	    
	    ball.paint(g);
	    
	  }
	  
//----------------------------------------------------------------- 
	  
	  public void run() {
		  
		  Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 
		  
		  while(true) {                   
		          
		      ball.moveBall();              
		      
		      repaint();                    
		         
		      try {
		        
		        Thread.sleep(5);
		        
		      } catch (InterruptedException ex) {
		        
		      }             
		      
		      Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
		    }
	  }	
	  
//-----------------------------------------------------------------
	
		public PingPong(String title) {
			super(title);
		}
//-----------------------------------------------------------------
		public static void main(String[] args) {
			PingPong test = new PingPong("PingPong-Spiel");
			test.setSize(1000, 500);
			test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			test.setVisible(true);
			new Thread(test).start();
		}
	
}


Und hier die des Balls:

Code:
import java.awt.*;
import javax.swing.*;


public class Ball {

  private int x, y;
  
  private int velocityX, velocityY;
  
  private Component component;
  
//----------------------------------------------------------------- 
  
  public Ball(int x, int y, Component component) {
    
    this.x = x;
    this.y = y;
    this.component = component;
    this.velocityX = 5;
    this.velocityY = 5;
  }
  
//-----------------------------------------------------------------   
  
  public int getX() {
    return x;
  }
  
  public int getY() {
    return y;
  }
  
//----------------------------------------------------------------- 
  
  public void moveBall() {
    
    
    if (x + 50 > 1020) {
      velocityX = -5;
      
    } else if (x < 10) {
      
      velocityX = 5;
    }
    
    
    if (y + 20 > 480) {
      velocityY = -5;
      
    } else if (y < 20) {
      
      velocityY = 5;
    }
    
    x += velocityX;
    
    y += velocityY;
  }
  
//----------------------------------------------------------------- 
  
  public void paint(Graphics g) {
    g.drawImage(Toolkit.getDefaultToolkit().getImage("Ball.png"), x, y, component);
  }
}


Die beiden Bilder, die aufgerufen werden sind einfach nur schlichte Grafiken und somit nichts besonderes.


Ja wäre wirklich nett wenn mir jemand zeigen könnte, wie man eine DoubleBuffering-Methode einbaut, damit das JFrame nicht mehr flackert.

Mfg
 
Hi,

zeichne nicht direkt auf das JFrame (das ist auch nicht ganz so schöner 'Stil'), sondern erstelle ein JPanel, auf dem dein Feld und der Ball gerendert werden und 'leg' es auf dein Frame.
Bei JPanels ist doublebuffering möglich und standardmäßig aktiviert.
Du kannst es über setDoubleBuffered(flag); ändern.
Eine andere Möglichkeit ist es, doublebuffering selbst zu implementieren, indem du in der paint()-Methode erst auf ein Bild (siehe BufferedImage) zeichest und zum Schluss das Bild als ganzes rendern lässt.

Schöne Grüße,
Cymatoxa
 

Neue Beiträge

Zurück