2009-03-07 10 views
0

J'essaie de montrer la fameuse ouverture/fermeture de l'animation du personnage de pacman dans un jeu de pacman jetable que je fais pour m'enseigner la programmation de jeux. Ce que je fais est de dessiner l'image de la bouche ouverte, puis de redessiner l'image de la bouche fermée exactement au même endroit (x/y). Mais cela ne fonctionne pas, et je vois tout le temps l'animation de la bouche fermée. Si je mets ceci dans une boucle, le système se fige et vous voyez scintillement où la bouche ouverte l'image, mais vous ne voyez pas les images remplacées.Comment montrer la bouche de Pacman ouvrir/fermer l'animation en Java avec double tampon?

J'ai testé et vérifié que les deux images sont chargées correctement et comme prévu.

Voilà ma fonction startAnim(), elle est appelée lorsque vous cliquez deux fois à l'applet:

public void beginGame() //Called from engine.java 
{ 
    isRunning=true; 
    repaint(); 
    pacman.startAnim(); 
} 

public void startAnim() //In different class, pacman.java 
{ 
    Image orig; 
    while (engine.isRunning) 
    { 
     orig=this.getCurrentImg(); 
     draw(engine.getGraphics()); 
     this.setCurrImg(currImg2); 
     this.draw(engine.getGraphics()); 
     this.setCurrImg(orig); 
     this.draw(engine.getGraphics()); 
     try 
     { 
      Thread.sleep(100); 
     } 
     catch (InterruptedException e) {} 
    } 
} 

public void draw(Graphics g) //Called from engine.paint() 
{ 
    g.drawImage(getCurrentImg(), getX(), 
      getY(), engine); 
} 

Répondre

3

vous devez dormir entre les 2 images. sinon, vous ne verrez que la dernière image peinte.

par ex.

while(running) 
{ 
    image 1 
    draw 
    sleep 
    image 2 
    draw 
    sleep 
} 

quelque chose comme ceci:

public void startAnim() //In different class, pacman.java 
{ 
          final int cnt = 2; 
    Image[] imgs = new Image[ cnt ]; 
    int   step = 0; 

    imgs[ 0 ] = closedMouthImage; 
    imgs[ 1 ] = openMouthImage; 

      while (engine.isRunning) 
      { 
       this.setCurrImg(imgs[ step ]); 
        draw(engine.getGraphics()); 
       step = (step + 1) % cnt; 
        try 
        { 
           Thread.sleep(100); 
        } 
        catch (InterruptedException e) {} 
      } 
} 
+0

Je fais déjà pas? en utilisant thread.sleep? –

+0

vous avez besoin de 2 threads, une fois entre chaque changement. maintenant vous changez l'image, dessinez, changez, dessinez, dormez. – sfossen

2

Comme l'a dit sfossen, vous avez besoin d'un délai entre les images de dessin.

Un couple d'autres choses à considérer.

  • Pour une animation fluide, vous avez probablement besoin de plus que des images «bouche ouverte» et «bouche fermée». Vous avez besoin de deux ou trois images intermédiaires.
  • Pour faciliter la gestion des ressources, vous pouvez regrouper toutes vos images d'animation en une seule image large, qui ressemblera à une «bande de film». Ensuite, pour dessiner un cadre, vous utilisez le décalage (x, y) pour le cadre qui vous intéresse.
  • Enfin, si vous dessinez toutes les images chaque fois que vous parcourez la boucle principale de votre programme, Pac-Man faire un chomp complet chaque fois que vous le déplacez. Vous devriez penser à dessiner une seule image à chaque fois à travers la boucle principale et à utiliser une variable pour suivre quelle image vous êtes.

Exemple (pseudocode)

frameWidth = 32 
frameIndex = 0 
while(running) { 
    // Draw just the frame of your animation that you want 
    drawImage(pacmanX, pacmanY, filmStrip, frameIndex * frameWidth, 0, frameWidth, frameHeight) 
    frameIndex = (frameIndex + 1) % frameCount 

    // Update position of pacman & ghosts 
    // Update sound effects, score indicators, etc. 
} 
+0

Je dors déjà, mais le pacman ne se met pas à jour du tout ... –

Questions connexes