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
相关产品推荐
相关产品推荐

