我正在创造一个像飞鸟一样的游戏,只有在触摸屏幕时,鸟才会拍动翅膀,但是当触摸屏幕时我在激活动画时遇到问题。
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。此外,我不认为这是正确的做法,如果你们有更好的想法或解决方案,请帮助。提前谢谢。
答案 0 :(得分:2)
可能有几种方法可以实现这一目标。当然,你需要增加你的timeState,这也取决于你的动画有多长,以及你想要它循环。
如果您创建的动画只播放一次,然后停止(直到再次触摸屏幕),则可以在触摸屏幕时将myTimeState设置为0,然后每帧递增一次。动画将贯穿,然后"停止"当它到达终点时(就像你说没有循环)。下次有人触摸屏幕时,myTimeState将重新设置为0并再次启动动画。
答案 1 :(得分:0)
首先,您必须确保动画的播放模式设置为Animation.PlayMode.NORMAL。它是一个默认设置,但是如果你将它设置为LOOPED,那么没有任何东西可以正常工作。
其次,在这种情况下我不会使用Input.justTouched()。相反,输入处理器中的监听器非常适合。这是Stage的一个例子。如果您不知道输入处理器是什么,请参阅event handling和class documentation上的教程。
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);
}
});
您可以根据animation.isAnimationFinished()
的结果选择要显示的内容(动画的关键帧或精灵) if(animation.isAnimationFinished(timeState)) {
//draw some sprite
} else {
//draw animation keyframe
}
我还没有检查过,但是有可能会导致最后一帧被删除,因为只要它被显示,animation.isAnimationFinished()就会返回true。我可能错了,所以你必须检查一下。如果它成为问题,您可以添加您的精灵作为动画的最后一帧。当动画结束时,它会在最后一帧上闪烁,这将是你的静态精灵。
在这两种情况下,你都会在游戏开始时播放你的动画,因为timeStep等于0.我看到2个解决方案,我建议你选择第二个:
将timeStep设置为一个较大的数字,肯定大于动画的持续时间。然后,Animation.isAnimationFinished()将返回true。
引入布尔变量isAnimationPlayed:
答案 2 :(得分:0)
您可以将timeState
设置为动画的持续时间。