feat(skill): 改进贝塞尔曲线弹道运动实现

- 为技能配置添加贝塞尔曲线参数控制:起始高度、中间高度和弧度系数
- 重构贝塞尔曲线控制点计算逻辑,移除冗余的水平投影计算
- 优化控制点生成算法,考虑距离、弧度系数和最小峰值高度
- 增加速度安全检查和最小时间限制,避免除零和异常情况
- 将多个射击技能从直线运动改为贝塞尔曲线运动,提供更自然的弹道效果
This commit is contained in:
panw
2026-03-30 16:46:10 +08:00
parent e1298bfe96
commit bbced29a0e
4 changed files with 39 additions and 24 deletions

View File

@@ -104,19 +104,17 @@ export class SMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
break;
case RType.bezier:
const bezierStartPos = v3(
moveComp.startPos.x + moveComp.atk_x,
moveComp.startPos.y + moveComp.atk_y,
moveComp.startPos.x,
moveComp.startPos.y + moveComp.bezierStartHeight,
moveComp.startPos.z
);
const bezierTargetPos = v3(
moveComp.targetPos.x + moveComp.atk_x,
moveComp.targetPos.y + moveComp.atk_y,
moveComp.targetPos.x,
moveComp.targetPos.y + moveComp.bezierStartHeight,
moveComp.targetPos.z
);
const horizonY = bezierStartPos.y;
const finalX = this.resolveBezierFinalXByHorizon(bezierStartPos, bezierTargetPos, horizonY);
moveComp.startPos.set(bezierStartPos);
moveComp.targetPos.set(finalX, horizonY, bezierTargetPos.z);
moveComp.targetPos.set(bezierTargetPos);
node.setPosition(bezierStartPos);
break;
default:
@@ -134,15 +132,6 @@ export class SMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
}
}
private resolveBezierFinalXByHorizon(startPos: Vec3, targetPos: Vec3, horizonY: number): number {
const deltaY = targetPos.y - startPos.y;
if (Math.abs(deltaY) < 0.0001) {
return targetPos.x;
}
const t = (horizonY - startPos.y) / deltaY;
return startPos.x + (targetPos.x - startPos.x) * t;
}
update(entity: ecs.Entity): void {
if(!smc.mission.play ) return;
if(smc.mission.pause) return