2011-03-20 3 views
1

J'écris un jeu assez simple en Java, et je suis confronté à la question du scintillement très sérieux quand je joue au jeu en tant qu'applet dans un navigateur. C'est-à-dire que tous mes sprites, qui sont peints sur un fond, sont parfois affichés à l'écran, mais généralement pas - ils clignotent de façon répétée sur l'écran puis disparaissent. J'ai lu que le double tampon est probablement la solution à cela, mais j'ai du mal à l'implémenter correctement. J'utilise un JApplet comme conteneur pour un JPanel. Ce JPanel est le conteneur sur lequel les sprites et les objets du jeu sont peints - c'est-à-dire, dans la méthode paintComonent de JPanel. Dans mon JApplet, j'utilise init, peinture, et les méthodes de remplacement de mise à jour comme suit:Java JApplet Graphics Double Buffering

Image offscreen; 

Graphics bufferGraphics; 

Dimension dim; 

public void init(){ 
    dim = getSize(); 

    setBackground(Color.BLACK); 

    offscreen = createImage(dim.width,dim.height); 

    bufferGraphics = offscreen.getGraphics(); 

} 

public void paint(Graphics g){ 
    bufferGraphics.clearRect(0,0,dim.width,dim.height); 
    //here is my question - i"m not sure what I should print to bufferGraphics 
    g.drawImage(offscreen, 0, 0, this); 
} 

public void update(Graphics g){ 
    paint(g); 
} 

Le problème que je suis en cours d'exécution en est que, à la ligne de commentaire, je ne suis pas sûr de ce qu'il faut faire pour obtenir l'image de l'applet actuelle imprimée à bufferGraphics. J'ai lu un example dans lequel le sprite a été peint directement sur le JApplet, sans utiliser un JPanel. À la lumière de cela, je suppose que je devrais peindre le JPanel sur bufferGraphics à la ligne commentée. Suis-je sur la bonne voie ici? Toute aide est grandement appréciée; Je voudrais juste savoir n'importe quel moyen de le faire correctement.

+0

Code reformaté, inversé si incorrect. –

Répondre

2

Swing est double buffered par défaut, il n'y a pas besoin de faire quelque chose de spécial.

Votre problème est probablement le code de peinture. Le code que vous avez posté est utilisé pour la peinture AWT, pas pour la peinture Swing.

La peinture personnalisée est effectuée en remplaçant la méthode paintComponent() d'un JPanel ou JComponent. Je vous suggère de commencer par lire le tutoriel Swing sur Custom Painting pour un exemple de travail.