Files
whale-town-front/scenes/characters/PlayerController.gd
xiangwang 8a5a4a0005 feat: 增加NPC范鲸晶
- player场景增加RayCast2D
- 增加npc场景
- 增加NPC对话气泡
2026-01-11 00:10:45 +08:00

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)