Java 如何在Libgdx中制作与Flappy Bird类似的动画?

Java 如何在Libgdx中制作与Flappy Bird类似的动画?,java,libgdx,Java,Libgdx,我正在创建一个类似于flappy bird的游戏,在这个游戏中,鸟只在触摸屏幕时拍打翅膀,但在触摸屏幕时激活动画时遇到问题 batch.draw(animation.getKeyFrame(myTimeState, false), x, y); //the myTimeState is 0 to render the 1st frame only. 然后,当触摸屏幕时,我会执行以下操作: //myTimeStep is just basically a controllable timeSta

我正在创建一个类似于flappy bird的游戏,在这个游戏中,鸟只在触摸屏幕时拍打翅膀,但在触摸屏幕时激活动画时遇到问题

batch.draw(animation.getKeyFrame(myTimeState, false), x, y); //the myTimeState is 0 to render the 1st frame only.
然后,当触摸屏幕时,我会执行以下操作:

//myTimeStep is just basically a controllable timeState for the animation only

    if(Gdx.input.justTouched){
         myTimeState = timeState;
    }else if(Gdx.input.justTouched == false && animation.isAnimationFinished(timeState)){
         myTimeState = 0;
    }

我认为动画无法播放所有帧,因为完成触摸屏幕后myTimeStep立即变为0。我也不认为这是正确的做法,如果你们有更好的想法或解决方案,请帮助。提前感谢。

实现这一点可能有几种方法。当然,您需要增加时间状态,这还取决于动画的长度以及是否要循环


如果您创建的动画仅播放一次,然后停止(直到再次触摸屏幕),则只需在触摸屏幕时将myTimeState设置为0,然后每帧递增一次。动画将运行,然后在到达终点时自行“停止”(正如您所说的“无循环”)。下次有人触摸屏幕时,myTimeState将设置回0,动画将再次开始

实现这一点可能有几种方法。当然,您需要增加时间状态,这还取决于动画的长度以及是否要循环


如果您创建的动画仅播放一次,然后停止(直到再次触摸屏幕),则只需在触摸屏幕时将myTimeState设置为0,然后每帧递增一次。动画将运行,然后在到达终点时自行“停止”(正如您所说的“无循环”)。下次有人触摸屏幕时,myTimeState将设置回0,动画将再次开始

首先,必须确保动画的播放模式设置为animation.playmode.NORMAL。这是一个默认设置,但如果您将其设置为循环,则不会按预期工作

其次,在这种情况下,我不会使用Input.justTouch()。相反,输入处理器中的侦听器非常适合。这里有一个Stage的例子。如果您不知道什么是输入处理器,下面是关于和的教程

您可以根据动画的结果选择要显示的内容(动画的关键帧或精灵)。isAnimationFinished()

我没有检查它,但有一种可能性,这可能会导致剪切最后一帧,因为一旦显示,animation.isAnimationFinished()将返回true。我可能错了,所以你得检查一下。如果出现问题,可以添加精灵作为动画的最后一帧。当动画结束时,它在最后一帧上闪烁,这将是您的静态精灵

在这两种情况下,您将在游戏开始时播放动画,因为timeStep等于0。我看到两种解决方案,建议您采用第二种:

  • 将timeStep设置为一个较大的数字,该数字肯定大于动画的持续时间。Animation.isAnimationFinished()随后将返回true

  • 引入布尔变量isanimation,该变量:

    • 初始化为false
    • 在单击侦听器中设置为true
    • 在isAnimationFinished()期间设置为false,仅当isAnimationPlayed为true时,才会调用每个帧
    • 在draw()方法中用于确定要显示的内容

  • 首先,必须确保动画的播放模式设置为animation.playmode.NORMAL。这是一个默认设置,但如果您将其设置为循环,则不会按预期工作

    其次,在这种情况下,我不会使用Input.justTouch()。相反,输入处理器中的侦听器非常适合。这里有一个Stage的例子。如果您不知道什么是输入处理器,下面是关于和的教程

    您可以根据动画的结果选择要显示的内容(动画的关键帧或精灵)。isAnimationFinished()

    我没有检查它,但有一种可能性,这可能会导致剪切最后一帧,因为一旦显示,animation.isAnimationFinished()将返回true。我可能错了,所以你得检查一下。如果出现问题,可以添加精灵作为动画的最后一帧。当动画结束时,它在最后一帧上闪烁,这将是您的静态精灵

    在这两种情况下,您将在游戏开始时播放动画,因为timeStep等于0。我看到两种解决方案,建议您采用第二种:

  • 将timeStep设置为一个较大的数字,该数字肯定大于动画的持续时间。Animation.isAnimationFinished()随后将返回true

  • 引入布尔变量isanimation,该变量:

    • 初始化为false
    • 在单击侦听器中设置为true
    • 在isAnimationFinished()期间设置为false,仅当isAnimationPlayed为true时,才会调用每个帧
    • 在draw()方法中用于确定要显示的内容

  • 您可以将
    时间状态设置为动画的持续时间。

    您可以将
    时间状态设置为动画的持续时间。

    我不确定是否理解。你想只在触摸屏时播放动画,并在触摸屏时停止吗?不,但我的代码就是这样,我想要的是像飞鸟一样的东西,当触摸屏时,飞鸟拍打翅膀,然后动画就只是一个普通的精灵。我不确定我是否理解。你想让动画只在触摸屏时播放,并在触摸屏时停止?不,但我的代码就是这样,我想要一个像飞鸟一样的东西,当触摸屏时,飞鸟拍动翅膀,然后在动画结束后,它就是一个普通的精灵。你是什么意思?例如,每个帧渲染为0.33,所以我应该执行timeState=0.33?但是,时间状态为ne
    stage.addListener(new ClickListener() {
            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                if(button == Input.Buttons.LEFT) {
                    timeState = 0;
                }
                return super.touchDown(event, x, y, pointer, button);
            }
        });
    
        if(animation.isAnimationFinished(timeState)) {
            //draw some sprite
        } else {
            //draw animation keyframe
        }