93 lines
2.4 KiB
GDScript
93 lines
2.4 KiB
GDScript
extends CharacterBody2D
|
|
|
|
# 信号定义
|
|
signal player_moved(position: Vector2)
|
|
|
|
# 常量定义
|
|
const MOVE_SPEED = 200.0
|
|
|
|
# 节点引用
|
|
@onready var animation_player: AnimationPlayer = $AnimationPlayer
|
|
@onready var sprite: Sprite2D = $Sprite2D
|
|
@onready var ray_cast: RayCast2D = $RayCast2D
|
|
|
|
var last_direction := "down"
|
|
|
|
func _ready() -> void:
|
|
# 检查是否有初始位置设置
|
|
call_deferred("_check_spawn_position")
|
|
|
|
# 播放初始动画
|
|
if animation_player.has_animation("idle"):
|
|
animation_player.play("idle")
|
|
|
|
# Initialize RayCast
|
|
ray_cast.add_exception(self) # Ignore local player
|
|
ray_cast.enabled = true
|
|
ray_cast.target_position = Vector2(0, 60)
|
|
|
|
func _check_spawn_position() -> void:
|
|
var spawn_pos = SceneManager.get_next_scene_position()
|
|
if spawn_pos != null:
|
|
global_position = spawn_pos
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
_handle_movement(delta)
|
|
_handle_interaction()
|
|
|
|
func _handle_interaction() -> void:
|
|
if Input.is_action_just_pressed("interact"):
|
|
if ray_cast.is_colliding():
|
|
var collider = ray_cast.get_collider()
|
|
if collider and collider.has_method("interact"):
|
|
collider.interact()
|
|
|
|
func _handle_movement(_delta: float) -> void:
|
|
# 获取移动向量 (参考 docs/02-开发规范/输入映射配置.md)
|
|
var direction := Input.get_vector(
|
|
"move_left", "move_right",
|
|
"move_up", "move_down"
|
|
)
|
|
|
|
# 应用移动
|
|
if direction != Vector2.ZERO:
|
|
velocity = direction * MOVE_SPEED
|
|
_update_animation_state(direction)
|
|
else:
|
|
velocity = Vector2.ZERO
|
|
_play_idle_animation()
|
|
|
|
move_and_slide()
|
|
|
|
# 发送移动事件 (如果位置发生明显变化)
|
|
if velocity.length() > 0:
|
|
EventSystem.emit_event(EventNames.PLAYER_MOVED, {
|
|
"position": global_position
|
|
})
|
|
|
|
func _update_animation_state(direction: Vector2) -> void:
|
|
if not animation_player:
|
|
return
|
|
|
|
# Determine primary direction
|
|
if abs(direction.x) > abs(direction.y):
|
|
if direction.x > 0:
|
|
last_direction = "right"
|
|
ray_cast.target_position = Vector2(60, 0)
|
|
else:
|
|
last_direction = "left"
|
|
ray_cast.target_position = Vector2(-60, 0)
|
|
else:
|
|
if direction.y > 0:
|
|
last_direction = "down"
|
|
ray_cast.target_position = Vector2(0, 60)
|
|
else:
|
|
last_direction = "up"
|
|
ray_cast.target_position = Vector2(0, -60)
|
|
|
|
animation_player.play("walk_" + last_direction)
|
|
|
|
func _play_idle_animation() -> void:
|
|
if animation_player:
|
|
animation_player.play("idle_" + last_direction)
|