94 lines
2.3 KiB
TypeScript
94 lines
2.3 KiB
TypeScript
import { Component } from '@esengine/ecs-framework';
|
||
import { Vec3 } from 'cc';
|
||
|
||
/**
|
||
* 速度组件 - 存储实体的运动速度信息
|
||
*
|
||
* 设计原则展示:
|
||
* 1. 与PositionComponent分离:遵循单一职责原则
|
||
* 2. 包含速度限制:避免无限加速
|
||
* 3. 提供常用的速度操作方法
|
||
*/
|
||
export class VelocityComponent extends Component {
|
||
/** 当前速度向量 */
|
||
public velocity: Vec3 = new Vec3();
|
||
/** 最大速度限制 */
|
||
public maxSpeed: number = 100;
|
||
/** 阻尼系数(0-1,1为无阻尼) */
|
||
public damping: number = 1.0;
|
||
|
||
constructor(x: number = 0, y: number = 0, z: number = 0, maxSpeed: number = 100) {
|
||
super();
|
||
this.velocity.set(x, y, z);
|
||
this.maxSpeed = maxSpeed;
|
||
}
|
||
|
||
/**
|
||
* 设置速度
|
||
*/
|
||
setVelocity(x: number, y: number, z: number = 0) {
|
||
this.velocity.set(x, y, z);
|
||
this.clampToMaxSpeed();
|
||
}
|
||
|
||
/**
|
||
* 添加速度(加速度效果)
|
||
*/
|
||
addVelocity(x: number, y: number, z: number = 0) {
|
||
this.velocity.x += x;
|
||
this.velocity.y += y;
|
||
this.velocity.z += z;
|
||
this.clampToMaxSpeed();
|
||
}
|
||
|
||
/**
|
||
* 应用阻尼
|
||
*/
|
||
applyDamping(deltaTime: number) {
|
||
if (this.damping < 1.0) {
|
||
const dampingFactor = Math.pow(this.damping, deltaTime);
|
||
this.velocity.multiplyScalar(dampingFactor);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 限制速度不超过最大值
|
||
*/
|
||
private clampToMaxSpeed() {
|
||
const speed = this.velocity.length();
|
||
if (speed > this.maxSpeed) {
|
||
this.velocity.normalize();
|
||
this.velocity.multiplyScalar(this.maxSpeed);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取当前速度大小
|
||
*/
|
||
getSpeed(): number {
|
||
return this.velocity.length();
|
||
}
|
||
|
||
/**
|
||
* 获取速度方向(单位向量)
|
||
*/
|
||
getDirection(): Vec3 {
|
||
const result = new Vec3();
|
||
Vec3.normalize(result, this.velocity);
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* 停止移动
|
||
*/
|
||
stop() {
|
||
this.velocity.set(0, 0, 0);
|
||
}
|
||
|
||
/**
|
||
* 检查是否在移动
|
||
*/
|
||
isMoving(): boolean {
|
||
return this.velocity.lengthSqr() > 0.01; // 避免浮点数精度问题
|
||
}
|
||
}
|