Frage

Ich versuche, das berühmte Mund zum Öffnen / Schließen-Animation des Pacman-Charakters in einem Wegwerf-Pacman-Spiel zu zeigen, ich mache mir Spiele-Programmierung zu unterrichten.

Was ich tue, ist das offene Mund Bild zeichnen, dann an der exakt gleichen das geschlossenen Mund Bild neu gezeichnet (x / y) Position. Aber dies nicht funktioniert, und ich sehe nur die geschlossenen Mund Animation die ganze Zeit.

Wenn ich dies in einer Schleife gelegt, wobei das System nur friert und Sie sehen, flackernde, wo das offene Mund dieses Bildes, aber Sie nicht sehen, die Bilder ersetzt werden.

Ich habe getestet und sorgte dafür, dass beiden Bilder korrekt geladen werden und wie erwartet.

Hier ist meine startAnim() Funktion, sein, wenn Sie Doppelklick auf das Applet genannt:

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);
}
War es hilfreich?

Lösung

Sie müssen zwischen den zwei Bildern schlafen. sonst werden Sie nur das letzte Bild sehen gemalt.

zB.

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

so etwas wie folgt aus:

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

Andere Tipps

Wie sfossen sagte, müssen Sie eine Verzögerung zwischen den Bildern zu ziehen.

Ein paar andere Dinge zu berücksichtigen.

  • Für glatte Animation, müssen Sie wahrscheinlich mehr als nur den „Mund offen“ und Bilder „Mund geschlossen“. Sie müssen zwei oder drei Zwischenbilder.
  • Ressourcenmanagement zu vereinfachen, möchten Sie vielleicht in einem einzigen, breiten Bild alle Ihre Animationsframes zusammen stellen, das wie ein „Filmstreifen“ aussehen wird. Dann einen Rahmen zu zeichnen, verwenden Sie die (x, y) Offset für den Rahmen Ihres Interesse an.
  • Schließlich, wenn Sie alle Frames jedes Mal ziehen Sie durch die Hauptschleife des Programms gehen, Pac-Man wird jedes Mal, wenn Sie ihm eine komplette chomp tun bewegen. Sie denken, sollte nur einen Rahmen jedes Mal durch die Hauptschleife über das Zeichnen und eine Variable, welcher Rahmen Sie sind zu verfolgen.

Beispiel (Pseudo-Code)

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.
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top