java - 如何用双缓冲在Java中显示Pacman的张嘴/闭嘴动画?

标签 java 2d sprite pacman

我正在制作一个一次性吃 bean 人游戏,试图在自学游戏编程的过程中展示吃 bean 人角色著名的张嘴/闭合动画。

我正在做的是绘制张开嘴的图像,然后在完全相同的 (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);
}

最佳答案

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

例如。

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

关于java - 如何用双缓冲在Java中显示Pacman的张嘴/闭嘴动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622375/

相关文章:

sprite - 让 Godot "Script Variables"控件在 2D 编辑器中出现?

css - 使用 aspnet 图像框架的 css 中的 Sprite

java - 错误 "Please fix the version conflict either by updating the version of the google-services"

java - 填充三角形/编译器错误

java - 当AsyncTask准备好时通知Activity?

3d - 任何使用 SpriteKit 在 2D 游戏中模拟 3D 球运动的方法?

xna - 如何在 SpriteBatch Draw XNA (2D) 中将两个 Sprite 相乘

java - 如何仅更新字段的子集并更新存储库?

c - 将非偶数行的文本文件读入二维数组

html - 背景图像未显示在 <div> 容器中