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; // 避免浮点数精度问题
|
|||
|
|
}
|
|||
|
|
}
|