如何修复Godot中AnimatedSprite2D的“Invalid get index 'flip'”错误
问题分析与修复
核心错误:flip.h 属性不存在
你遇到的报错是因为 Godot的AnimatedSprite2D节点没有flip.h这个属性,控制水平翻转的正确属性是flip_h(下划线分隔的命名),而非点语法的flip.h。
把这两行代码:
get_node("AnimatedSprite2D").flip.h = true get_node("AnimatedSprite2D").flip.h = false
替换为:
get_node("AnimatedSprite2D").flip_h = true get_node("AnimatedSprite2D").flip_h = false
额外逻辑问题修复
除了上述错误,你的代码还有几处逻辑问题会导致移动和动画异常:
缩进错误导致移动减速逻辑混乱
velocity.x = move_toward(velocity.x, 0, SPEED)这行应该放在if direction:的else分支里,否则当你按下方向键时,代码会先给velocity.x赋值为方向×速度,立刻又执行减速到0,导致角色无法移动。动画播放顺序问题
当前代码中Fall动画的判断在Run/Idle之后,会被后续的动画覆盖,应该把Fall动画的判断放在最前面(或调整顺序,确保下落时优先播放Fall)。重复调用get_node影响性能
建议像缓存AnimationPlayer一样,提前缓存AnimatedSprite2D节点,避免每次_physics_process都调用get_node。
修正后的完整代码
extends CharacterBody2D const SPEED = 300.0 const JUMP_VELOCITY = -400.0 var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") @onready var anim = get_node("AnimationPlayer") @onready var sprite = get_node("AnimatedSprite2D") # 缓存精灵节点 func _physics_process(delta): if not is_on_floor(): velocity.y += gravity * delta if Input.is_action_just_pressed("ui_accept") and is_on_floor(): velocity.y = JUMP_VELOCITY anim.play("Jump") var direction = Input.get_axis("ui_left", "ui_right") print(direction) # 处理翻转 if direction == -1: sprite.flip_h = true elif direction == 1: sprite.flip_h = false # 处理移动 if direction: velocity.x = direction * SPEED if velocity.y == 0: anim.play("Run") else: # 没有方向输入时减速到0 velocity.x = move_toward(velocity.x, 0, SPEED) if velocity.y == 0: anim.play("Idle") # 下落动画优先判断 if velocity.y > 0: anim.play("Fall") move_and_slide()
这样修改后,角色就能正常左右移动、翻转,且不会触发崩溃错误,动画逻辑也更合理。
内容的提问来源于stack exchange,提问作者Irnes Sumbuljevic
相关产品推荐
相关产品推荐

