forked from moyin/whale-town-front
75 lines
1.7 KiB
GDScript
75 lines
1.7 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
|
|
|
|
var last_direction := "down"
|
|
|
|
func _ready() -> void:
|
|
# 检查是否有初始位置设置
|
|
call_deferred("_check_spawn_position")
|
|
|
|
# 播放初始动画
|
|
if animation_player.has_animation("idle"):
|
|
animation_player.play("idle")
|
|
|
|
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)
|
|
|
|
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"
|
|
else:
|
|
last_direction = "left"
|
|
else:
|
|
if direction.y > 0:
|
|
last_direction = "down"
|
|
else:
|
|
last_direction = "up"
|
|
|
|
animation_player.play("walk_" + last_direction)
|
|
|
|
func _play_idle_animation() -> void:
|
|
if animation_player:
|
|
animation_player.play("idle_" + last_direction)
|