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

Godot 2D游戏枪口闪光动画优化:解决松开按键中途消失问题

修复枪口闪光卡顿问题

问题分析

你的代码存在三个核心问题导致卡顿:

  • 按住射击键时每帧都调用play(),强制动画从头启动,永远无法走完完整播放流程,视觉上重复闪烁卡顿。
  • 松开按键时直接调用stop(),中断正在播放的动画,导致画面突兀跳转。
  • 每帧执行rotation_degrees +=180,让枪口闪光持续旋转,进一步加剧视觉混乱。

修复代码

extends StaticBody2D

@onready var _animated_sprite = $AnimatedSprite2D

func _ready():
    # 监听动画结束信号,播完后自动处理隐藏逻辑
    _animated_sprite.connect("animation_finished", self, "_on_animation_finished")
    visible = false

func _process(_delta):
    # 仅调整一次朝向,而非每帧旋转180度
    look_at(get_global_mouse_position())
    rotation += PI  # 等价于180度,用Godot推荐的弧度单位

    if Input.is_action_pressed("shoot"):
        visible = true
        # 仅当动画未播放时启动,避免每帧重置
        if not _animated_sprite.is_playing():
            _animated_sprite.play("muzzleFlash")
    else:
        # 松开按键后不立刻停止,让当前动画播完再处理
        pass

func _on_animation_finished():
    # 动画结束后,如果没按住射击键,就隐藏并停止
    if not Input.is_action_pressed("shoot"):
        visible = false
        _animated_sprite.stop()

额外优化建议

  • 如果你的枪口闪光是单次射击触发(而非按住持续闪光),建议改用_input()或_unhandled_input()监听射击按键的pressed事件,每次按下只播放一次动画:
    func _unhandled_input(event):
        if event.is_action_pressed("shoot"):
            visible = true
            _animated_sprite.play("muzzleFlash")
            # 这里可以添加射击逻辑(生成子弹等)
    
  • 确保你的muzzleFlash动画设置正确:如果是持续闪光效果,将动画设为循环播放;如果是单次闪光,关闭循环,让它自然结束。

内容的提问来源于stack exchange,提问作者Owen Uhl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:47:34