diff --git a/star-raid/js/enemies.js b/star-raid/js/enemies.js index 61a6a7e..fd3eca0 100644 --- a/star-raid/js/enemies.js +++ b/star-raid/js/enemies.js @@ -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.x0&&b.x>b.tx)||(dx<0&&b.x