Boss通用移动提前换向消除端点停顿

- 原到达判定|dx|<1导致减速到接近0再重启=视觉顿挫
- 改为剩8px即换向:速度连续反向过渡不过零停顿,过冲由边界内缩6px吸收
- 模拟:低速连帧从20~40降到3~5,0越界,中线规则保持
This commit is contained in:
JOJO 2026-08-06 16:46:14 +08:00
parent e2d70147e5
commit 2b192b65aa

View File

@ -315,20 +315,19 @@ function updateBoss(){
else if(b.idx===6){const usp=b.phase>=1?0.028:0.008,amp=b.phase>=1?70:44;
b.x=clamp(b.x+amp*usp*Math.cos(b.mt*usp),30,W-30); // 速度积分定位:换阶段参数突变也不瞬移
b.yA=(b.yA||8)+((b.phase>=1?12:8)-(b.yA||8))*0.05;b.y=b.ty+Math.sin(b.mt*0.011)*b.yA;} // 夺权者XP1巨大笨重→P2紧凑灵活
else{ // 通用游走:中线分界——左侧只向右/右侧只向左,目标始终在中线另一侧;速度积分带加速度与惯性;边界防撞
else{ // 通用游走:中线分界——左侧只向右/右侧只向左,目标始终在中线另一侧;速度积分带加速度与惯性;提前换向消除端点停顿
const r0=(def.rr&&def.rr[0])||def.r||20,mgn=12+(def.wide?6:0);
const minX=mgn+r0,maxX=W-mgn-r0;
const minX=mgn+r0+6,maxX=W-mgn-r0-6; // 内缩6px:为换向过冲留余量
if(typeof b.tx!=="number"){b.vx=0;const L=def.wide?rndi(35,80):rndi(50,105);b.tx=clamp(b.x<W/2?W/2+L:W/2-L,minX,maxX);} // 首帧:目标在中线另一侧
const dx=b.tx-b.x;
if(Math.abs(dx)<1){b.x=b.tx;b.vx=0; // 到达:下一目标在中线另一侧,方向自然反转
if(Math.abs(dx)<=8){ // 提前换向:剩一小段距离即转向,速度连续反向过渡(不过零停顿、不归零重启)
const L=def.wide?rndi(35,80):rndi(50,105);
b.tx=clamp(b.x<W/2?W/2+L:W/2-L,minX,maxX);}
else{
const maxSpd=def.wide?1.0:1.4,inertia=def.wide?0.06:0.07;
const targetV=Math.sign(dx)*Math.min(maxSpd,Math.sqrt(Math.abs(dx))*0.16); // 距目标越近目标速度越小→自然加减速
b.vx+=(targetV-b.vx)*inertia; // 速度缓动=加速度/惯性
b.x+=b.vx;
if((dx>0&&b.x>b.tx)||(dx<0&&b.x<b.tx))b.x=b.tx;} // 防过冲截断
b.x+=b.vx;}
b.y=b.ty+Math.sin(b.mt*0.011)*(def.wide?8:12);} // 上下浮动保留(钢琴站桩除外)
b.mt++;
const fm=b.fireM*(1+0.22*b.phase);