Comment afficher l'animation d'ouverture / fermeture de bouche de Pacman en Java avec double tampon?

StackOverflow https://stackoverflow.com/questions/622375

  •  05-07-2019
  •  | 
  •  

Question

J'essaie de montrer la célèbre animation d'ouverture / fermeture de bouche du personnage de pacman dans un jeu de pacman jetable que je suis en train de faire pour apprendre à programmer moi-même.

Ce que je fais dessine l'image de la bouche ouverte, puis redessine l'image de la bouche fermée au même emplacement (x / y). Mais cela ne fonctionne pas et je vois tout le temps l’animation à bouche fermée.

Si je mets cela en boucle, le système se bloque et vous voyez un scintillement où l'image de la bouche ouverte est affichée, mais vous ne voyez pas les images être remplacées.

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

Voici ma fonction startAnim () , elle est appelée lorsque vous double-cliquez sur 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);
}
Était-ce utile?

La solution

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

par exemple.

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) {}
            }
}

Autres conseils

Comme le dit sfossen, il faut un délai entre le dessin des images.

Quelques autres éléments à prendre en compte.

  • Pour une animation fluide, vous avez probablement besoin de plus que le "bouche ouverte". et " bouche fermée " images. Vous avez besoin de deux ou trois images intermédiaires.
  • Pour faciliter la gestion des ressources, vous souhaiterez peut-être regrouper toutes vos images d'animation dans une seule image large ressemblant à un "film fixe". Ensuite, pour dessiner un cadre, utilisez le décalage (x, y) correspondant au cadre qui vous intéresse.
  • Enfin, si vous dessinez tous les cadres chaque fois que vous passez par la boucle principale de votre programme, Pac-Man fera un chomp complet à chaque fois que vous le déplacerez. Pensez à ne dessiner qu’une image à la fois dans la boucle principale et à utiliser une variable pour déterminer l’image sur laquelle 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.
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top