2010-01-14 24 views
4

Je me demandais si quelqu'un pouvait me pointer dans la bonne direction, j'ai développé un jeu de pong et il a besoin d'un double tampon dû au scintillement. Iv a essayé quelques-uns de la poste ici pour essayer de le faire fonctionner, mais je suis encore un débutant avec le swing awt suffi, toute aide serait incroyable merci.Java Panel Double Buffering

public class PongPanel extends JPanel implements Runnable { 

private int screenWidth = 500; 
private int screenHeight = 300; 

private boolean isPaused = false; 
private boolean isGameOver = false; 

private int playToPoints = 10; 

private Padel player1,player2; 
private Ball ball; 

private Thread gameThread; 
private Image dbImage; 
private Graphics dbg; 

public PongPanel() { 
    setPreferredSize(new Dimension(screenWidth,screenHeight)); 
    setBackground(Color.BLACK); 
    setDoubleBuffered(true); 
    setFocusable(true); 
    requestFocus(); 

    player1 = new Padel(Position.LEFT,screenWidth,screenHeight); 
    player2 = new Padel(Position.RIGHT,screenWidth,screenHeight); 
    ball = new Ball(10,screenWidth/2,screenHeight/2,Color.WHITE); 
} 

public void addNotify(){ 
super.addNotify(); 
    startGame(); 
} 

private void startGame(){ 
    gameThread = new Thread(this); 
    gameThread.start(); 
} 

@Override 
public void run() { 
while (!isGameOver) { 
dbImage = createImage(screenWidth,screenHeight); 
dbg = this.getGraphics(); 
if(!isPaused){ 
    if(!gameOverCheck()){ 
    updateGame(); 
    paintComponents(dbg); 
    } 
}else if(isPaused){ 
    dbg.setColor(Color.ORANGE); 
    dbg.setFont(new Font("serif",Font.BOLD,50)); 
    dbg.drawString("Paused", screenWidth/2-82, screenHeight/2); 
} 
try { 
    Thread.sleep(30); 
    } catch (InterruptedException e) {e.printStackTrace();} 
    } 
    } 

    private boolean gameOverCheck(){ 
    if(player1.getScore() == playToPoints){ 
    dbg.setColor(player1.getColour()); 
    dbg.setFont(new Font("serif",Font.BOLD,50)); 
    dbg.drawString("Player 1 Wins!", screenWidth/2 - 161, screenHeight/2); 
    setGameOver(true); 
    return true; 
    }else if(player2.getScore() == playToPoints){ 
    dbg.setColor(player2.getColour()); 
    dbg.setFont(new Font("serif",Font.BOLD,50)); 
    dbg.drawString("Player 2 Wins!", screenWidth/2 - 161, screenHeight/2); 
    setGameOver(true); 
    return true; 
    } 

    return false; 
} 

private void updateGame(){ 
    ball.move(screenWidth,screenHeight,player1,player2); 
    player1.aiForPadel(screenWidth, screenHeight, ball.getX(), ball.getY()); 
    player2.aiForPadel(screenWidth, screenHeight, ball.getX(), ball.getY()); 

} 

    @Override 
    public void paintComponents(Graphics g) { 
    super.paintComponents(g); 
    dbg.setColor(Color.BLACK); 
    dbg.fillRect(0, 0, screenWidth+20, screenHeight+20); 
    dbg.setColor(Color.WHITE); 
    dbg.drawLine(screenWidth/2, 0, screenWidth/2, screenHeight); 
    dbg.setFont(new Font("serif",Font.BOLD,32)); 
    dbg.drawString(player1.getScore()+"", screenWidth/2-40, screenHeight - 20); 
    dbg.drawString(player2.getScore()+"", screenWidth/2+20, screenHeight - 20); 
    ball.drawBall(dbg); 
    player1.drawPadel(dbg); 
    player2.drawPadel(dbg); 
} 
} 

Répondre

4

Il y a un très bon tutoriel here qui décrit comment utiliser BufferStrategy pour produire une animation non-vacillante.

Les points importants sont les suivants:

  • Appel setIgnoreRepaint(true) sur le haut niveau Canvas pour empêcher AWT de repeindre, comme vous généralement être faites vous-même dans la boucle d'animation.
  • Obtenir le du BufferStrategy (plutôt objet Graphics2D que d'utiliser l'instance passée via paintComponent(Graphics g).
+0

merci beaucoup Adamski – user250643

1

A doit lire sur le mécanisme de la peinture dans AWT et Swing

Painting in AWT and Swing

+0

merci beaucoup Helper Méthode – user250643

+0

Votre accueil ^^ – helpermethod

+2

Bien que cela puisse théoriquement répondre à la question, [il serait préférable] (http://meta.stackoverflow.com/q/8259) à inclure les parties essentielles de la réponse ici, et fournir le lien pour référence. –

-1

Je pense vous pouvez simplement appeler super(true); première chose, et cela indique simplement le JPanel qu'il est à double tampon ... parce que l'un des constructeurs de JPanel est:J'espère que cela aidera quelqu'un même si c'est presque quatre ans plus tard.

+0

Le constructeur par défaut de JPanel l'appelle déjà: public JPanel() {this (true); } –