refactor(hero): 统一击退位移逻辑到MoveSystem
将英雄后退的视图层位移操作迁移到MoveSystem统一处理, 通过knockbackVelocity组件属性实现平滑的击退位移衰减与边界钳制, 移除HeroViewComp中直接操作节点位置的代码,解耦视图与战斗逻辑。
This commit is contained in:
@@ -28,7 +28,7 @@ export class MoveComp extends ecs.Comp {
|
||||
baseY: number = 0;
|
||||
/** 出生序,用于同条件渲染排序稳定 */
|
||||
spawnOrder: number = 0;
|
||||
/** 击退速度(像素/秒),受击瞬间赋值,每帧指数衰减至 0 */
|
||||
/** 击退速度(像素/秒),受击瞬间由 HeroAtkSystem 赋值,MoveSystem 每帧指数衰减至 0 */
|
||||
knockbackVelocity: number = 0;
|
||||
|
||||
reset() {
|
||||
@@ -85,11 +85,25 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
return;
|
||||
}
|
||||
|
||||
/** 所有移动都锁定在 baseY,避免出现“漂移” */
|
||||
/** 所有移动都锁定在 baseY,避免出现"漂移" */
|
||||
if (view.node.position.y !== move.baseY) {
|
||||
view.node.setPosition(view.node.position.x, move.baseY, 0);
|
||||
}
|
||||
|
||||
/** 击退位移:每帧叠加 knockbackVelocity 并指数衰减,与推进解耦 */
|
||||
if (Math.abs(move.knockbackVelocity) > 0.01) {
|
||||
const newX = view.node.position.x + move.knockbackVelocity * this.dt;
|
||||
const clampedX = this.clampByFacBoundary(newX, model.fac);
|
||||
if (Math.abs(clampedX - view.node.position.x) > 0.01) {
|
||||
view.node.setPosition(clampedX, view.node.position.y, 0);
|
||||
}
|
||||
// 时间常数 τ=0.1s:0.1 秒衰减到约 37%,0.3 秒衰减到约 5%,总位移 ≈ v0 * 0.0632
|
||||
move.knockbackVelocity *= Math.exp(-10 * this.dt);
|
||||
if (Math.abs(move.knockbackVelocity) < 0.01) {
|
||||
move.knockbackVelocity = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/** 准备阶段:双方原地待命,不推进不索敌 */
|
||||
if (!smc.mission.in_fight) {
|
||||
this.clearCombatTarget(model);
|
||||
|
||||
Reference in New Issue
Block a user