You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX调用Gdx.input.justTouched()触发动画时播放速度过快

问题原因

Gdx.input.justTouched() 仅在触摸事件触发的单帧内返回true,后续帧无论触摸是否持续,该方法都会返回false,直到下一次全新的触摸按下动作才会再次触发。
你将动画时间累加、关键帧绘制的全部逻辑都写在这个判断分支内,会导致动画仅在触摸触发的那一帧执行一次时间累加(累加值仅为单帧delta,约0.01~0.016秒)、绘制一次单帧,后续帧既不会累加动画时间,也不会执行绘制逻辑。你观察到的“千分之一秒就消失、播放速度异常快”本质是动画根本没有逐帧播放,仅渲染了一帧就停止,和new Animation(0.25f)设置的帧时长参数没有关系。

修复方法

将触摸触发逻辑和动画播放逻辑拆分:触摸事件仅负责标记动画启动状态、重置动画进度;动画的时间累加、帧绘制逻辑独立于触摸判断,只要动画处于播放状态就逐帧执行。

  1. 先在对应类中添加动画播放状态标记:
    // 标记爆炸动画是否正在播放
    boolean isBoomPlaying = false;
    
  2. 在渲染方法中拆分逻辑,参考代码如下:
    // 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:21:30