Boss移动:中线分界+加速度惯性+突击幅度微变
- 通用8Boss:以屏幕中线为界,左侧只向右/右侧只向左,目标始终在中线另一侧(方向自然交替) - 速度积分:目标速度随距离变化(sqrt映射)+速度缓动惯性=起步加速/接近减速,峰值1.4(普通)/1.0(宽体) - 暗黑突击:移动风格不变(sin/速度积分波形),幅度每1.6~3.3秒微调±12(48~74)并缓动防瞬移 - 模拟3万帧:换向时中线规则100%成立,0越界,加减速帧均衡
This commit is contained in:
parent
cbac48e468
commit
e2d70147e5
@ -306,21 +306,29 @@ function updateBoss(){
|
||||
}
|
||||
// —— 常规移动 ——
|
||||
if(def.static){b.x+=(W/2-b.x)*0.05;b.y+=(52-b.y)*0.02;}
|
||||
else if(b.idx===3){ // 暗黑突击:小体型高机动;三阶段更快+上下范围更大+惯性更小(速度积分,转折锐利)
|
||||
if(b.phase>=2){b.x=clamp(b.x+62*0.052*Math.cos(b.mt*0.052),26,W-26);b.y=b.ty+Math.sin(b.mt*0.03)*27;}
|
||||
else{b.x=W/2+Math.sin(b.mt*0.034)*62;b.y=b.ty+Math.sin(b.mt*0.021)*18;}}
|
||||
else if(b.idx===3){ // 暗黑突击:移动风格不变(速度积分波形),幅度每1.6~3.3秒微调±12(48~74)
|
||||
if(typeof b.ampX!=="number"){b.ampX=62;b.ampTarget=62;b.ampT=rndi(100,200);}
|
||||
if(b.ampT<=0){b.ampT=rndi(100,200);b.ampTarget=clamp(b.ampTarget+rndi(-12,12),48,74);}
|
||||
b.ampT--;b.ampX+=(b.ampTarget-b.ampX)*0.02; // 幅度缓动,防参数突变瞬移
|
||||
if(b.phase>=2){b.x=clamp(b.x+b.ampX*0.052*Math.cos(b.mt*0.052),26,W-26);b.y=b.ty+Math.sin(b.mt*0.03)*27;}
|
||||
else{b.x=W/2+Math.sin(b.mt*0.034)*b.ampX;b.y=b.ty+Math.sin(b.mt*0.021)*18;}}
|
||||
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;} // 夺权者X:P1巨大笨重→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;
|
||||
if(typeof b.tx!=="number")b.tx=clamp(b.x,minX,maxX); // 落地后首帧初始化
|
||||
const dx=b.tx-b.x,spd=def.wide?0.8:1.05;
|
||||
if(Math.abs(dx)<=spd){b.x=b.tx; // 到达:换方向,每趟长度随机(长度不够空间时自动收敛到边界内)
|
||||
const dir=dx>=0?-1:1,len=def.wide?rndi(35,80):rndi(50,105);
|
||||
b.tx=clamp(b.x+dir*len,minX,maxX);}
|
||||
else b.x+=Math.sign(dx)*spd;
|
||||
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; // 到达:下一目标在中线另一侧,方向自然反转
|
||||
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.y=b.ty+Math.sin(b.mt*0.011)*(def.wide?8:12);} // 上下浮动保留(钢琴站桩除外)
|
||||
b.mt++;
|
||||
const fm=b.fireM*(1+0.22*b.phase);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user