62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
|
|
import { Component } from '@esengine/ecs-framework';
|
|||
|
|
import { Vec3 } from 'cc';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 位置组件 - 存储实体的空间位置信息
|
|||
|
|
*
|
|||
|
|
* 这是最基础的组件示例,展示了ECS组件的设计原则:
|
|||
|
|
* 1. 主要存储数据,少量辅助方法
|
|||
|
|
* 2. 单一职责:只负责位置相关的数据
|
|||
|
|
* 3. 可复用:任何需要位置信息的实体都可以使用
|
|||
|
|
*/
|
|||
|
|
export class PositionComponent extends Component {
|
|||
|
|
/** 3D位置坐标 */
|
|||
|
|
public position: Vec3 = new Vec3();
|
|||
|
|
/** 上一帧的位置(用于计算移动距离) */
|
|||
|
|
public lastPosition: Vec3 = new Vec3();
|
|||
|
|
|
|||
|
|
constructor(x: number = 0, y: number = 0, z: number = 0) {
|
|||
|
|
super();
|
|||
|
|
this.position.set(x, y, z);
|
|||
|
|
this.lastPosition.set(x, y, z);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 设置位置
|
|||
|
|
*/
|
|||
|
|
setPosition(x: number, y: number, z: number = 0) {
|
|||
|
|
this.lastPosition.set(this.position);
|
|||
|
|
this.position.set(x, y, z);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 移动位置
|
|||
|
|
*/
|
|||
|
|
move(deltaX: number, deltaY: number, deltaZ: number = 0) {
|
|||
|
|
this.lastPosition.set(this.position);
|
|||
|
|
this.position.x += deltaX;
|
|||
|
|
this.position.y += deltaY;
|
|||
|
|
this.position.z += deltaZ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 计算到另一个位置的距离
|
|||
|
|
*/
|
|||
|
|
distanceTo(other: PositionComponent): number {
|
|||
|
|
return Vec3.distance(this.position, other.position);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取本帧移动的距离
|
|||
|
|
*/
|
|||
|
|
getMovementDistance(): number {
|
|||
|
|
return Vec3.distance(this.position, this.lastPosition);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 检查是否在指定范围内
|
|||
|
|
*/
|
|||
|
|
isWithinRange(target: PositionComponent, range: number): boolean {
|
|||
|
|
return this.distanceTo(target) <= range;
|
|||
|
|
}
|
|||
|
|
}
|