Como mostrar a boca perto de animação da Pacman aberta / em Java com buffer duplo?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando mostrar a abertura da boca famosa / fechando animação do personagem pacman em um jogo descartável pacman que estou fazendo para me ensinar programação jogo.

O que estou fazendo está atraindo a imagem da boca aberta, então redesenhar a imagem Boca fechada no mesmo exato (x / y) local. Mas isso não funciona, e eu só ver a animação boca fechada o tempo todo.

Se eu colocar isso em um loop, o sistema simplesmente congela e você vê piscando onde a imagem boca aberta isso, mas você não vê as imagens sendo substituído.

Eu testei e que garantir que ambas as imagens estão sendo carregada corretamente e como esperado.

Aqui está a minha função startAnim(), a sua chamada quando você clicar duas vezes no 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);
}
Foi útil?

Solução

você tem que dormir entre as 2 imagens. caso contrário, você só vai ver a última imagem pintada.

por exemplo.

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

algo como isto:

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

Outras dicas

Como sfossen disse, você precisa de um atraso entre desenho das imagens.

Um par de outras coisas a considerar.

  • Para animação suave, você provavelmente precisará de mais do que apenas a "boca aberta" e "boca fechada" imagens. Você precisa de duas ou três imagens intermediárias.
  • Para fazer a gestão de recursos mais fácil, você pode querer colocar todos os seus quadros de animação juntos em uma imagem única, de largura, que vai olhar como uma "filmstrip". Então, para desenhar um quadro, você usar os (x, y) de compensação para o quadro seu na interessados.
  • Finalmente, se você tirar todas as armações cada vez que você passar o loop principal do seu programa, Pac-Man vai fazer um chomp completa cada vez que você movê-lo. Você deve pensar sobre o desenho apenas um quadro de cada vez através do loop principal e usando uma variável para controlar o quadro que você está.

Exemplo (pseudocódigo)

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.
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top