| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- # 玩家控制脚本
- extends CharacterBody2D
- # 移动速度
- @export var speed: float = 200.0
- # 当前可交互的NPC
- var nearby_npc: Node = null
- # 交互状态 (交互时禁用移动)
- var is_interacting: bool = false
- # 节点引用
- @onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
- @onready var camera: Camera2D = $Camera2D
- # 音效引用 ⭐
- @onready var interact_sound: AudioStreamPlayer = null # 交互音效
- @onready var running_sound: AudioStreamPlayer = null # 走路音效
- # 走路音效状态 ⭐
- var is_playing_running_sound: bool = false
- func _ready():
- # 添加到player组 (重要!NPC需要通过这个组来识别玩家)
- add_to_group("player")
- # 获取音效节点 (可选,如果不存在也不会报错) ⭐
- interact_sound = get_node_or_null("InteractSound")
- running_sound = get_node_or_null("RunningSound")
- if interact_sound:
- print("[INFO] 玩家交互音效已启用")
- else:
- print("[WARN] 玩家没有InteractSound节点,交互音效已禁用")
- if running_sound:
- print("[INFO] 玩家走路音效已启用")
- else:
- print("[WARN] 玩家没有RunningSound节点,走路音效已禁用")
- Config.log_info("玩家初始化完成")
- # 启用相机
- camera.enabled = true
- # 播放默认动画
- if animated_sprite.sprite_frames != null and animated_sprite.sprite_frames.has_animation("idle"):
- animated_sprite.play("idle")
- func _physics_process(_delta: float):
- # 如果正在交互,禁用移动
- if is_interacting:
- velocity = Vector2.ZERO
- move_and_slide()
- # 播放idle动画
- if animated_sprite.sprite_frames != null and animated_sprite.sprite_frames.has_animation("idle"):
- animated_sprite.play("idle")
- # 停止走路音效 ⭐
- stop_running_sound()
- return
- # 获取输入方向
- var input_direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
- # 设置速度
- velocity = input_direction * speed
- # 移动
- move_and_slide()
- # 更新动画和朝向
- update_animation(input_direction)
- # 更新走路音效 ⭐
- update_running_sound(input_direction)
- func update_animation(direction: Vector2):
- """更新角色动画 (支持4方向)"""
- if animated_sprite.sprite_frames == null:
- return
- # 根据移动方向播放动画
- if direction.length() > 0:
- # 移动中 - 判断主要方向
- if abs(direction.x) > abs(direction.y):
- # 左右移动
- if direction.x > 0:
- # 向右
- if animated_sprite.sprite_frames.has_animation("walk_right"):
- animated_sprite.play("walk_right")
- animated_sprite.flip_h = false
- elif animated_sprite.sprite_frames.has_animation("walk"):
- animated_sprite.play("walk")
- animated_sprite.flip_h = false
- else:
- # 向左
- if animated_sprite.sprite_frames.has_animation("walk_left"):
- animated_sprite.play("walk_left")
- animated_sprite.flip_h = false
- elif animated_sprite.sprite_frames.has_animation("walk"):
- animated_sprite.play("walk")
- animated_sprite.flip_h = true
- else:
- # 上下移动
- if direction.y > 0:
- # 向下
- if animated_sprite.sprite_frames.has_animation("walk_down"):
- animated_sprite.play("walk_down")
- elif animated_sprite.sprite_frames.has_animation("walk"):
- animated_sprite.play("walk")
- else:
- # 向上
- if animated_sprite.sprite_frames.has_animation("walk_up"):
- animated_sprite.play("walk_up")
- elif animated_sprite.sprite_frames.has_animation("walk"):
- animated_sprite.play("walk")
- else:
- # 静止
- if animated_sprite.sprite_frames.has_animation("idle"):
- animated_sprite.play("idle")
- func _input(event: InputEvent):
- # 按E键与NPC交互
- # 检查E键 (KEY_E = 69)
- if event is InputEventKey:
- if event.pressed and not event.echo:
- # 调试: 打印所有按键
- print("[DEBUG] 按键: ", event.keycode, " (E=69, Enter=4194309)")
- if event.keycode == KEY_E or event.keycode == KEY_ENTER or event.is_action_pressed("ui_accept"):
- print("[DEBUG] 检测到E键, nearby_npc=", nearby_npc)
- if nearby_npc != null:
- interact_with_npc()
- print("[INFO] E键触发交互")
- else:
- print("[WARN] 没有附近的NPC可以交互")
- func interact_with_npc():
- """与附近的NPC交互"""
- if nearby_npc != null:
- # 播放交互音效 ⭐
- if interact_sound:
- interact_sound.play()
- Config.log_info("与NPC交互: " + nearby_npc.npc_name)
- # 发送信号给对话系统
- get_tree().call_group("dialogue_system", "start_dialogue", nearby_npc.npc_name)
- func set_nearby_npc(npc: Node):
- """设置附近的NPC"""
- nearby_npc = npc
- if npc != null:
- print("[INFO] ✅ 进入NPC范围: ", npc.npc_name)
- Config.log_info("进入NPC范围: " + npc.npc_name)
- else:
- print("[INFO] ❌ 离开NPC范围")
- Config.log_info("离开NPC范围")
- func get_nearby_npc() -> Node:
- """获取附近的NPC"""
- return nearby_npc
- func set_interacting(interacting: bool):
- """设置交互状态"""
- is_interacting = interacting
- if interacting:
- print("[INFO] 🔒 玩家进入交互状态,移动已禁用")
- # 停止走路音效 ⭐
- stop_running_sound()
- else:
- print("[INFO] 🔓 玩家退出交互状态,移动已启用")
- # ⭐ 更新走路音效
- func update_running_sound(direction: Vector2):
- """更新走路音效"""
- if running_sound == null:
- return
- # 如果正在移动
- if direction.length() > 0:
- # 如果音效还没播放,开始播放
- if not is_playing_running_sound:
- running_sound.play()
- is_playing_running_sound = true
- print("[INFO] 🎵 开始播放走路音效")
- else:
- # 如果停止移动,停止音效
- stop_running_sound()
- # ⭐ 停止走路音效
- func stop_running_sound():
- """停止走路音效"""
- if running_sound and is_playing_running_sound:
- running_sound.stop()
- is_playing_running_sound = false
- print("[INFO] 🔇 停止走路音效")
|