LibGDX调用Gdx.input.justTouched()触发动画时播放速度过快
问题原因
Gdx.input.justTouched() 仅在触摸事件触发的单帧内返回true,后续帧无论触摸是否持续,该方法都会返回false,直到下一次全新的触摸按下动作才会再次触发。
你将动画时间累加、关键帧绘制的全部逻辑都写在这个判断分支内,会导致动画仅在触摸触发的那一帧执行一次时间累加(累加值仅为单帧delta,约0.01~0.016秒)、绘制一次单帧,后续帧既不会累加动画时间,也不会执行绘制逻辑。你观察到的“千分之一秒就消失、播放速度异常快”本质是动画根本没有逐帧播放,仅渲染了一帧就停止,和new Animation(0.25f)设置的帧时长参数没有关系。
修复方法
将触摸触发逻辑和动画播放逻辑拆分:触摸事件仅负责标记动画启动状态、重置动画进度;动画的时间累加、帧绘制逻辑独立于触摸判断,只要动画处于播放状态就逐帧执行。
- 先在对应类中添加动画播放状态标记:
// 标记爆炸动画是否正在播放 boolean isBoomPlaying = false; - 在渲染方法中拆分逻辑,参考代码如下:
// 1. 触摸事件仅负责触发动画启动 if (Gdx.input.justTouched()) { isBoomPlaying = true; // 每次触发重置动画时间,避免从上次播放的进度继续 boomAnimation.elapsedTime = 0f; } // 2. 动画播放逻辑独立执行,逐帧更新进度、绘制 if (isBoomPlaying) { boomAnimation.elapsedTime += Gdx.graphics.getDeltaTime(); // 第二个参数传false代表不循环播放,需要循环就改为true TextureRegion currentFrame = (TextureRegion) boomAnimation.animation.getKeyFrame(boomAnimation.elapsedTime, false); // 非循环模式下检测动画是否播放完成,完成后停止播放 if (boomAnimation.animation.isAnimationFinished(boomAnimation.elapsedTime)) { isBoomPlaying = false; } else { game.batch.draw(currentFrame, 137, 121, 80, 80); } }
如果需要动画循环播放,去掉播放完成的判断逻辑,将getKeyFrame的第二个参数改为true即可。
内容的提问来源于stack exchange,提问作者witsel
相关产品推荐
相关产品推荐

