From e2d70147e5ae2a7168c8d7765e1fbbe75c8af5c0 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Thu, 6 Aug 2026 16:44:06 +0800 Subject: [PATCH] =?UTF-8?q?Boss=E7=A7=BB=E5=8A=A8:=E4=B8=AD=E7=BA=BF?= =?UTF-8?q?=E5=88=86=E7=95=8C+=E5=8A=A0=E9=80=9F=E5=BA=A6=E6=83=AF?= =?UTF-8?q?=E6=80=A7+=E7=AA=81=E5=87=BB=E5=B9=85=E5=BA=A6=E5=BE=AE?= =?UTF-8?q?=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 通用8Boss:以屏幕中线为界,左侧只向右/右侧只向左,目标始终在中线另一侧(方向自然交替) - 速度积分:目标速度随距离变化(sqrt映射)+速度缓动惯性=起步加速/接近减速,峰值1.4(普通)/1.0(宽体) - 暗黑突击:移动风格不变(sin/速度积分波形),幅度每1.6~3.3秒微调±12(48~74)并缓动防瞬移 - 模拟3万帧:换向时中线规则100%成立,0越界,加减速帧均衡 --- star-raid/js/enemies.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) 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