0

我正在尝试在我正在制作的一次性 pacman 游戏中展示 pacman 角色著名的张嘴/闭合动画,以自学游戏编程。

我正在做的是绘制张开的嘴巴图像,然后在完全相同的(x/y)位置重新绘制闭合的嘴巴图像。但这不起作用,我只是一直看到闭口动画。

如果我把它放在一个循环中,系统就会冻结,你会看到张开嘴的图像在闪烁,但你看不到被替换的图像。

我已经测试并确保两个图像都按预期正确加载。

这是我的startAnim()函数,当您双击小程序时调用它:

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);
}
4

2 回答 2

3

你必须在两张图片之间睡觉。否则你只会看到最后绘制的图像。

例如。

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

像这样的东西:

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) {}
            }
}
于 2009-03-07T20:02:57.357 回答
2

正如 sfossen 所说,您需要在绘制图像之间进行延迟。

还有一些其他的事情要考虑。

  • 对于流畅的动画,您可能需要的不仅仅是“张嘴”和“嘴巴闭合”的图像。您需要两个或三个中间图像。
  • 为了使资源管理更容易,您可能希望将所有动画帧放在一个单一的宽幅图像中,看起来像“幻灯片”。然后,要绘制一个框架,您可以使用您感兴趣的框架的 (x, y) 偏移量。
  • 最后,如果您每次通过程序的主循环时都绘制所有帧,那么每次移动吃豆人时,吃豆人都会完全咬住他。您应该考虑每次通过主循环仅绘制一帧并使用变量来跟踪您所在的帧。

示例(伪代码)

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.
}
于 2009-03-07T20:15:25.720 回答