124 lines
2.9 KiB
TypeScript
124 lines
2.9 KiB
TypeScript
import { Component } from '@esengine/ecs-framework';
|
||
import { Vec2 } from 'cc';
|
||
|
||
/**
|
||
* 玩家输入组件 - 存储玩家的输入状态
|
||
*
|
||
* 标记组件示例:
|
||
* 1. 标识这是一个玩家控制的实体
|
||
* 2. 存储输入状态数据
|
||
* 3. 输入处理逻辑在InputSystem中实现
|
||
*/
|
||
export class PlayerInputComponent extends Component {
|
||
/** 移动输入方向(-1到1) */
|
||
public moveDirection: Vec2 = new Vec2();
|
||
/** 按键状态 */
|
||
public keys: { [key: string]: boolean } = {};
|
||
/** 鼠标位置 */
|
||
public mousePosition: Vec2 = new Vec2();
|
||
/** 鼠标按键状态 */
|
||
public mouseButtons: { left: boolean; right: boolean; middle: boolean } = {
|
||
left: false,
|
||
right: false,
|
||
middle: false
|
||
};
|
||
|
||
/** 是否启用输入 */
|
||
public inputEnabled: boolean = true;
|
||
/** 输入敏感度 */
|
||
public sensitivity: number = 1.0;
|
||
|
||
constructor() {
|
||
super();
|
||
}
|
||
|
||
/**
|
||
* 设置移动方向
|
||
*/
|
||
setMoveDirection(x: number, y: number) {
|
||
this.moveDirection.set(x, y);
|
||
// 标准化方向向量(对角线移动不应该更快)
|
||
if (this.moveDirection.lengthSqr() > 1) {
|
||
this.moveDirection.normalize();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 设置按键状态
|
||
*/
|
||
setKey(key: string, pressed: boolean) {
|
||
this.keys[key] = pressed;
|
||
}
|
||
|
||
/**
|
||
* 检查按键是否按下
|
||
*/
|
||
isKeyPressed(key: string): boolean {
|
||
return this.keys[key] || false;
|
||
}
|
||
|
||
/**
|
||
* 检查是否有移动输入
|
||
*/
|
||
hasMovementInput(): boolean {
|
||
return this.moveDirection.lengthSqr() > 0.01;
|
||
}
|
||
|
||
/**
|
||
* 获取标准化的移动方向
|
||
*/
|
||
getNormalizedMoveDirection(): Vec2 {
|
||
const result = new Vec2(this.moveDirection);
|
||
if (result.lengthSqr() > 0) {
|
||
result.normalize();
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* 设置鼠标位置
|
||
*/
|
||
setMousePosition(x: number, y: number) {
|
||
this.mousePosition.set(x, y);
|
||
}
|
||
|
||
/**
|
||
* 设置鼠标按键状态
|
||
*/
|
||
setMouseButton(button: 'left' | 'right' | 'middle', pressed: boolean) {
|
||
this.mouseButtons[button] = pressed;
|
||
}
|
||
|
||
/**
|
||
* 检查鼠标按键是否按下
|
||
*/
|
||
isMouseButtonPressed(button: 'left' | 'right' | 'middle'): boolean {
|
||
return this.mouseButtons[button];
|
||
}
|
||
|
||
/**
|
||
* 清除所有输入状态
|
||
*/
|
||
clearInput() {
|
||
this.moveDirection.set(0, 0);
|
||
this.keys = {};
|
||
this.mouseButtons.left = false;
|
||
this.mouseButtons.right = false;
|
||
this.mouseButtons.middle = false;
|
||
}
|
||
|
||
/**
|
||
* 禁用输入
|
||
*/
|
||
disableInput() {
|
||
this.inputEnabled = false;
|
||
this.clearInput();
|
||
}
|
||
|
||
/**
|
||
* 启用输入
|
||
*/
|
||
enableInput() {
|
||
this.inputEnabled = true;
|
||
}
|
||
}
|