using Godot; using System; using System.Collections.Generic; // 使用 List 和 Dictionary 需要这个命名空间 namespace Cosmobox { public partial class Player : Pawn, IThing { // === 玩家属性 === [Export] public Camera2D PlayerCamera; // 玩家摄像机 [Export] public Sprite2D AimCursor; // 瞄准光标精灵 [Export] public Vector2 AimOffset = Vector2.Zero; // 瞄准点偏移量 public BagItemList bagItem = new(); public override void _Ready() { // 调用基类的_Ready方法 base._Ready(); // 尝试查找摄像机(如果未分配) if (PlayerCamera == null) { PlayerCamera = GetViewport().GetCamera2D(); if (PlayerCamera == null) { GD.PrintErr("Player: 未分配摄像机且视口中没有活动摄像机!"); } } // 初始化瞄准光标 if (AimCursor != null) { AimCursor.Visible = true; } } public void Update(double delta) { // 获取输入方向 Vector2 inputDirection = GetInputDirection(); // 处理移动(调用Pawn基类方法) HandleMovement(inputDirection); // 更新角色朝向(鼠标方向) UpdateDirectionToMouse(); } /// /// 更新角色朝向鼠标方向 /// private void UpdateDirectionToMouse() { if (PlayerCamera == null) return; // 获取鼠标在游戏世界中的位置 Vector2 mousePosition = GetGlobalMousePosition(); // 计算从玩家位置到鼠标位置的方向向量 Vector2 directionToMouse = (mousePosition - GlobalPosition).Normalized(); // 调用基类方法更新视觉方向 UpdateDirection(directionToMouse); } /// /// 更新瞄准光标位置 /// private void UpdateAimCursor() { if (AimCursor == null || PlayerCamera == null) return; // 获取鼠标位置 Vector2 mousePosition = GetGlobalMousePosition(); // 设置光标位置(带偏移) AimCursor.GlobalPosition = mousePosition + AimOffset; } /// /// 获取键盘输入方向 /// /// 归一化的移动方向向量 private Vector2 GetInputDirection() { Vector2 direction = Vector2.Zero; // 处理上下左右输入(确保项目设置中已配置这些输入) if (Input.IsActionPressed("ui_up")) { direction.Y -= 1; // 上移 } if (Input.IsActionPressed("ui_down")) { direction.Y += 1; // 下移 } if (Input.IsActionPressed("ui_left")) { direction.X -= 1; // 左移 } if (Input.IsActionPressed("ui_right")) { direction.X += 1; // 右移 } return direction.Normalized(); // 确保斜向移动速度一致 } /// /// 获取瞄准方向(从玩家指向鼠标位置) /// public Vector2 GetAimDirection() { if (PlayerCamera == null) return Vector2.Zero; Vector2 mousePosition = GetGlobalMousePosition(); return (mousePosition - GlobalPosition).Normalized(); } /// /// 获取瞄准角度(弧度) /// public float GetAimAngle() { Vector2 aimDir = GetAimDirection(); return Mathf.Atan2(aimDir.Y, aimDir.X); } /// /// 获取瞄准角度(度) /// public float GetAimAngleDegrees() { return Mathf.RadToDeg(GetAimAngle()); } } }