修复夺权者X无敌+隐形bug:yA缓变式减数用裸undefined→NaN→y=NaN(bossHit永不命中);已修并node回归模拟验证。夺权者X外观v3重做(严格按参考图):几何装甲板拼装——交错装甲翼板×3/侧+格栅翼蓝条纹×3+三联红炮口武器舱(黄标识/舱下双炮管)+箭形主舰体(中脊光带/反应环/长条蓝窗/板缝铆钉/引擎列);P2同风格壮实战机(宽翼板+小武器舱+粗箭形机身);发射点改武器舱炮口(±50/56/62)。仅语法检查+逻辑模拟验证,未运行游戏验证
This commit is contained in:
parent
f3e93b2ff2
commit
93e1f4699d
@ -76,80 +76,85 @@ function drawPiano(b,t,fl,split){
|
||||
ctx.beginPath();ctx.arc(kx,28,2+3.5*pr,0,TAU);ctx.fill();
|
||||
ctx.globalAlpha=1;}}
|
||||
}
|
||||
/* ---- 夺权者X:P1三层阶梯甲板母舰(巨大厚重)→ P2抛甲板露粗壮宽翼战机(紧凑但不细瘦) ----
|
||||
无眼睛设计(机械反应环,非生物眼);变形=甲板整体抛离旋转飞走+机身渐显(壳下常存) */
|
||||
/* ---- 夺权者X:几何装甲板拼装宽体楔形母舰(P1)→ 抛侧舱同风格壮实战机(P2) ----
|
||||
参考图核心特征:交错装甲板+深板缝+蓝色发光条纹格栅翼+三联红炮口武器舱+橙/黄小标识;无生物眼(机械反应环) */
|
||||
function drawUsurper(b,t,fl,ph2,mp){
|
||||
const jt=mp||0;
|
||||
// —— P2粗壮宽翼战机(壳下常存,mp渐显;宽翼+厚机身+三引擎,绝不细瘦) ——
|
||||
// —— P2同风格壮实战机(壳下常存,mp渐显;宽翼板+小武器舱+粗箭形机身) ——
|
||||
if(ph2>=1){const di=mp!==null?mp:1;
|
||||
ctx.save();ctx.globalAlpha=di;const ds=(0.7+0.3*di)*1.15;ctx.scale(ds,ds);
|
||||
for(const sd of[-1,1]){ // 后掠宽翼(翼展±30)
|
||||
poly([sd*11,0,sd*28,-13,sd*32,-7,sd*13,8],"#c9d6e2");
|
||||
poly([sd*11,0,sd*28,-13,sd*26,-10,sd*12,3],"#e8f4ff"); // 翼面受光
|
||||
drawSeg(sd*12,-1,sd*27,-11,2,"#43b8ff",0.9); // 前缘蓝灯带
|
||||
px(sd*28-2,-13,4,3,"#ff9a3d"); // 翼尖橙标识
|
||||
px(sd*12,4,3,3,"#ff3355");} // 翼根红炮口
|
||||
poly([0,32,-13,16,-11,-18,-6,-32,6,-32,11,-18,13,16],"#e8f4ff"); // 粗壮机身
|
||||
poly([0,32,13,16,11,-18,6,-32,0,-32],"#9fb0c6");
|
||||
px(-11,-18,22,2,"#5a6c80");px(-9,-6,18,2,"#5a6c80"); // 装甲板缝
|
||||
px(-13,16,26,3,"#ffffff"); // 底缘受光(粗边框感)
|
||||
// 中央反应环(机械环非眼睛:外环+旋转弧段+内芯搏动)
|
||||
circ(0,-10,7,"#0d2244");
|
||||
ctx.strokeStyle=fl||"#43b8ff";ctx.lineWidth=2;ctx.beginPath();ctx.arc(0,-10,7,0,TAU);ctx.stroke();
|
||||
for(let k=0;k<3;k++){const ra=t*0.03+k*TAU/3;
|
||||
ctx.beginPath();ctx.arc(0,-10,7,ra,ra+0.8);ctx.stroke();}
|
||||
circ(0,-10,3+Math.sin(t*0.1)*0.5,"#bfefff");
|
||||
if(b.laserT>0){ctx.globalAlpha=di*0.5;circ(0,-10,10,"#7ce9ff");ctx.globalAlpha=di;} // 巨宽激光期高亮
|
||||
for(const sd of[-1,1]){px(sd*5-2,-34,4,3,"#5a6c80"); // 三引擎尾焰
|
||||
px(sd*5-1.5,-38-(t%4),3,3+(t%4),t%6<3?"#7fd8ff":"#43b8ff");}
|
||||
px(-1.5,-34,3,3,"#5a6c80");px(-1,-39-(t%4),2,2+(t%4),"#7fd8ff");
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
// —— P1巨舰(变形=甲板抛离飞走+舰体淡出;整体1.25倍放大=参考图体量) ——
|
||||
if(ph2===0||mp!==null){ctx.save();ctx.scale(1.25,1.25);const hullA=1-jt;
|
||||
if(hullA>0.02){ctx.save();ctx.globalAlpha=hullA;
|
||||
// 主舰体:三段式宽塔(厚重霸气)
|
||||
poly([0,36,-24,14,-20,-14,-12,-36,12,-36,20,-14,24,14],"#d8e4f0");
|
||||
poly([0,36,24,14,20,-14,12,-36,0,-36],"#9fb0c6");
|
||||
px(-24,14,48,3,"#e8f4ff"); // 底缘受光
|
||||
px(-20,2,40,2,"#5a6c80");px(-16,-14,32,2,"#5a6c80");px(-12,-24,24,2,"#5a6c80"); // 层间板缝
|
||||
for(let k=0;k<6;k++)px(-18+k*7,-1,2,2,"#8a9ab8"); // 装甲铆钉
|
||||
// 指挥塔(顶部)+天线
|
||||
px(-8,-44,16,8,"#c9d6e2");px(-5,-50,10,6,"#9fb0c6");
|
||||
px(-1,-56,2,6,"#5a6c80");px(-1.5,-58,3,2,t%30<15?"#ff3355":"#7a1622");
|
||||
// 中央反应环(机械环非眼睛:外环+旋转弧段+内芯搏动)
|
||||
circ(0,-6,9,"#0d2244");
|
||||
ctx.strokeStyle=fl||"#43b8ff";ctx.lineWidth=2;ctx.beginPath();ctx.arc(0,-6,9,0,TAU);ctx.stroke();
|
||||
for(let k=0;k<3;k++){const ra=t*0.02+k*TAU/3;
|
||||
ctx.globalAlpha=hullA*0.85;ctx.beginPath();ctx.arc(0,-6,9,ra,ra+0.7);ctx.stroke();ctx.globalAlpha=hullA;}
|
||||
circ(0,-6,4+Math.sin(t*0.08)*0.6,"#bfefff");
|
||||
if(b.laserT>0){ctx.globalAlpha=hullA*0.5;circ(0,-6,12,"#7ce9ff");ctx.globalAlpha=hullA;}
|
||||
// 机腹炮列(红色炮口一排)
|
||||
for(let k=-2;k<=2;k++)px(k*8-1.5,18,3,4,"#ff3355");
|
||||
// 引擎列(顶部4喷口,焰长抖动)
|
||||
for(let e=0;e<4;e++){const ex2=-12+e*8;
|
||||
px(ex2-2,-40,4,3,"#5a6c80");
|
||||
px(ex2-1.5,-44-(t+e*2)%4,3,3+(t+e*2)%4,e%2?"#7fd8ff":"#43b8ff");}
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
// —— 三层阶梯甲板(左右各3层;变形=整体抛离旋转飞走,带运动轨迹) ——
|
||||
for(const sd of[-1,1])for(let L=0;L<3;L++){
|
||||
const ja=(1-jt)*(1-jt*0.85);
|
||||
if(ja<=0.02)continue;
|
||||
ctx.save();ctx.translate(sd*jt*(70+L*30),jt*(30+L*14));ctx.rotate(sd*jt*(0.4+L*0.25));ctx.globalAlpha=ja;
|
||||
const dw=34+L*9,dy=-26+L*13; // 阶梯向下外扩
|
||||
poly([sd*8,dy-5,sd*(dw+8),dy,sd*(dw+4),dy+9,sd*8,dy+7],"#c9d6e2");
|
||||
poly([sd*8,dy-5,sd*(dw+8),dy,sd*(dw+4),dy+3,sd*8,dy+1],"#e8f4ff"); // 甲板面受光
|
||||
px(sd*(dw+2)-2,dy+2,4,2,t%50<25?"#7fd8ff":"#2a5a78"); // 板缘蓝灯带(明灭)
|
||||
px(sd*(dw-8)-2,dy+4,4,3,"#ff9a3d"); // 橙色标识块
|
||||
px(sd*14-1,dy+1,10,1,"#5a6c80"); // 甲板板缝
|
||||
for(let g=0;g<2+L;g++){const gx=sd*(14+g*10); // 红色炮口(deckVolley前摇:最下层逐个点亮)
|
||||
const glow=b.deckT>0&&L===2&&(26-b.deckT)>g*6;
|
||||
px(gx-1,dy+7,3,3,glow?"#ffffff":"#ff3355");}
|
||||
if(L===1){const tx3=sd*(dw+2); // 侧舷双联副炮塔(随甲板抛离)
|
||||
px(tx3-2,dy-8,5,10,"#9fb0c6");
|
||||
px(tx3-1,dy-12,1.5,5,"#5a6c80");px(tx3+1,dy-12,1.5,5,"#5a6c80");
|
||||
px(tx3-1.5,dy-14,2,2,"#ff3355");px(tx3+0.5,dy-14,2,2,"#ff3355");}
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
ctx.save();ctx.globalAlpha=di;const ds=0.75+0.25*di;ctx.scale(ds,ds);
|
||||
for(const sd of[-1,1]){ctx.save();ctx.scale(sd,1); // 后掠翼板(蓝条纹+橙标识+翼根炮口)
|
||||
poly([10,-16,34,-24,40,-14,34,-6,12,-6],"#c9d6e2");
|
||||
poly([10,-16,34,-24,30,-19,12,-11],"#e8f4ff"); // 翼面受光
|
||||
drawSeg(14,-10,30,-19,2,"#43b8ff",0.85); // 蓝色翼纹
|
||||
px(30,-22,4,3,"#ff9a3d");px(12,-5,3,3,"#ff3355");
|
||||
px(18,4,12,12,"#c9d6e2");px(20,6,8,6,"#2a3444"); // 小武器舱
|
||||
px(21,7,3,3,"#ff3355");px(25,7,3,3,"#ff3355"); // 双联红炮口
|
||||
px(21,16,3,6,"#5a6c80");px(25,16,3,6,"#5a6c80"); // 舱下炮管
|
||||
ctx.restore();}
|
||||
poly([0,46,-15,12,-13,-24,-8,-34,8,-34,13,-24,15,12],"#e8f4ff"); // 粗箭形机身
|
||||
poly([0,46,15,12,13,-24,8,-34,0,-34],"#9fb0c6");
|
||||
px(-1,-22,2,52,t%50<25?"#43b8ff":"#2a5a78"); // 中脊蓝色光带(搏动)
|
||||
px(-13,-24,26,2,"#5a6c80");px(-11,-4,22,2,"#5a6c80"); // 装甲板缝
|
||||
circ(0,-14,7,"#0d2244"); // 中央反应环(机械环非眼睛)
|
||||
ctx.strokeStyle=fl||"#43b8ff";ctx.lineWidth=2;ctx.beginPath();ctx.arc(0,-14,7,0,TAU);ctx.stroke();
|
||||
for(let k=0;k<3;k++){const ra=t*0.03+k*TAU/3;ctx.beginPath();ctx.arc(0,-14,7,ra,ra+0.8);ctx.stroke();}
|
||||
circ(0,-14,3+Math.sin(t*0.1)*0.5,"#bfefff");
|
||||
if(b.laserT>0){ctx.globalAlpha=di*0.5;circ(0,-14,10,"#7ce9ff");ctx.globalAlpha=di;}
|
||||
px(-2,2,4,16,"#0d2244");px(-1,4,2,12,t%40<20?"#7fd8ff":"#2a5a78"); // 中线长条蓝窗(参考图特征)
|
||||
for(const sd of[-1,1]){px(sd*6-2,-36,4,3,"#5a6c80"); // 双引擎尾焰
|
||||
px(sd*6-1.5,-40-(t%4),3,3+(t%4),t%6<3?"#7fd8ff":"#43b8ff");}
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
// —— P1母舰(变形=翼板/武器舱抛离飞走+舰体淡出) ——
|
||||
if(ph2===0||mp!==null){
|
||||
// —— 后翼面(格栅翼+蓝条纹×3) ——
|
||||
for(const sd of[-1,1]){const ja=(1-jt)*(1-jt*0.9);if(ja<=0.02)continue;
|
||||
ctx.save();ctx.translate(sd*jt*110,jt*50);ctx.rotate(sd*jt*0.6);ctx.scale(sd,1);ctx.globalAlpha=ja;
|
||||
poly([20,-38,66,-50,76,-40,72,-28,26,-22],"#c9d6e2");
|
||||
poly([20,-38,66,-50,60,-44,24,-32],"#e8f4ff"); // 受光面
|
||||
for(let k=0;k<3;k++)drawSeg(34+k*12,-34-k*4,44+k*12,-44-k*3,2,"#43b8ff",0.85); // 蓝色翼纹×3
|
||||
for(let k=0;k<4;k++)px(30+k*11,-30-k*2,2,8,"#9fb0c6"); // 格栅
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
// —— 中层装甲翼板×3/侧(交错层叠) ——
|
||||
const PL=[[14,-30],[30,-22],[44,-14]];
|
||||
for(const sd of[-1,1])for(let L=0;L<3;L++){
|
||||
const ja=(1-jt)*(1-jt*0.85);if(ja<=0.02)continue;
|
||||
ctx.save();ctx.translate(sd*jt*(80+L*26),jt*(36+L*12));ctx.rotate(sd*jt*(0.45+L*0.2));ctx.scale(sd,1);ctx.globalAlpha=ja;
|
||||
const x0=PL[L][0],y0=PL[L][1];
|
||||
poly([x0,y0,x0+26,y0+4,x0+22,y0+16,x0+4,y0+14],"#d8e4f0");
|
||||
poly([x0+4,y0+14,x0+22,y0+16,x0+26,y0+4,x0+20,y0+8],"#9fb0c6"); // 右下暗边
|
||||
poly([x0,y0,x0+26,y0+4,x0+24,y0+6,x0+2,y0+2],"#e8f4ff"); // 上缘受光
|
||||
if(L===1)px(x0+16,y0+6,4,3,"#ff9a3d"); // 橙色小标识
|
||||
if(L===2)drawSeg(x0+6,y0+3,x0+20,y0+6,2,"#43b8ff",0.8); // 板面蓝纹
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
// —— 武器舱段(三联红炮口深槽+黄标识+舱下双炮管;deckVolley逐个点亮) ——
|
||||
for(const sd of[-1,1]){const ja=(1-jt)*(1-jt*0.85);if(ja<=0.02)continue;
|
||||
ctx.save();ctx.translate(sd*jt*95,jt*44);ctx.rotate(sd*jt*0.55);ctx.scale(sd,1);ctx.globalAlpha=ja;
|
||||
px(44,0,24,22,"#c9d6e2");px(44,0,24,3,"#e8f4ff");
|
||||
px(46,4,20,9,"#2a3444"); // 炮座深槽
|
||||
for(let g=0;g<3;g++)px(48+g*6,6,4,5,(b.deckT>0&&(26-b.deckT)>g*6)?"#ffffff":"#ff3355"); // 三联红炮口
|
||||
px(45,15,4,3,"#ffcf5c"); // 黄标识
|
||||
px(48,22,3,9,"#5a6c80");px(59,22,3,9,"#5a6c80"); // 舱下双炮管
|
||||
px(48.5,29,2,3,"#43b8ff");px(59.5,29,2,3,"#43b8ff");
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
// —— 中央箭形主舰体(最前层:宽顶→尖下巴,中脊光带+反应环+长条蓝窗) ——
|
||||
const ha=1-jt;if(ha>0.02){ctx.save();ctx.globalAlpha=ha;
|
||||
poly([0,54,-17,10,-15,-26,-9,-40,9,-40,15,-26,17,10],"#e8f4ff");
|
||||
poly([0,54,17,10,15,-26,9,-40,0,-40],"#9fb0c6"); // 右半暗面
|
||||
px(-1,-28,2,66,t%50<25?"#43b8ff":"#2a5a78"); // 中脊蓝色光带(搏动)
|
||||
px(-15,-26,30,2,"#5a6c80");px(-13,-2,26,2,"#5a6c80"); // 板缝
|
||||
for(let k=0;k<4;k++)px(-12+k*7,-25,2,2,"#8a9ab8"); // 铆钉
|
||||
circ(0,-18,8,"#0d2244"); // 中央反应环(机械环非眼睛)
|
||||
ctx.strokeStyle=fl||"#43b8ff";ctx.lineWidth=2;ctx.beginPath();ctx.arc(0,-18,8,0,TAU);ctx.stroke();
|
||||
for(let k=0;k<3;k++){const ra=t*0.02+k*TAU/3;ctx.beginPath();ctx.arc(0,-18,8,ra,ra+0.7);ctx.stroke();}
|
||||
circ(0,-18,3.5+Math.sin(t*0.08)*0.5,"#bfefff");
|
||||
if(b.laserT>0){ctx.globalAlpha=ha*0.5;circ(0,-18,11,"#7ce9ff");ctx.globalAlpha=ha;}
|
||||
px(-2.5,4,5,22,"#0d2244");px(-1,6,2,18,t%40<20?"#7fd8ff":"#2a5a78"); // 中线长条蓝窗(参考图特征)
|
||||
for(let e=0;e<3;e++){const ex2=-10+e*10; // 顶部引擎列
|
||||
px(ex2-2,-42,4,3,"#5a6c80");
|
||||
px(ex2-1.5,-46-(t+e*2)%4,3,3+(t+e*2)%4,e%2?"#7fd8ff":"#43b8ff");}
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
}
|
||||
}
|
||||
/* ---- 暗黑魔碟:8扇区缝合装甲碟+红能量窗/裂纹+紫红竖瞳魔眼 ----
|
||||
变形沿用原机制(mp优先):P2圆环绕顶轴外旋裂开+魔眼点亮;P3爆甲壳板飞离+铆钉伸长成刺+犄角炮台 */
|
||||
|
||||
@ -302,7 +302,7 @@ function updateBoss(){
|
||||
else if(b.idx===3){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===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)*0.05;b.y=b.ty+Math.sin(b.mt*0.011)*b.yA;} // 夺权者X:P1巨大笨重→P2紧凑灵活
|
||||
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{b.x=W/2+Math.sin(b.mt*0.013)*(def.wide?44:70);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);
|
||||
@ -311,7 +311,7 @@ function updateBoss(){
|
||||
const span=46*(0.22+0.78*(b.phase>=1?1:0.62));
|
||||
ebul(b.x+rnd(-span,span),b.y+rnd(-10,2),Math.PI/2+rnd(-0.08,0.08),rnd(2.2,3.4),"orbR",12);}
|
||||
if(b.idx===6&&b.deckT>0){b.deckT--; // 夺权者X:甲板齐射——炮口逐个点亮(前摇26帧)后6发垂直弹雨
|
||||
if(b.deckT===0)for(const sd of[-1,1])for(const gx of[18,30,55])ebul(b.x+sd*gx,b.y+9,Math.PI/2,2.6,"dartB",14);}
|
||||
if(b.deckT===0)for(const sd of[-1,1])for(const gx of[50,56,62])ebul(b.x+sd*gx,b.y+8,Math.PI/2,2.6,"dartB",14);}
|
||||
if(b.idx===8){ // 黑石要塞:亚空间主炮序列(纹路充能52帧→巨柱扫动80帧)
|
||||
if(!b.plT||b.plT<=0)b.plT=Math.round((b.phase>=1?380:460)/fm);
|
||||
else{
|
||||
@ -434,7 +434,7 @@ function bossMain(b,def,fm){
|
||||
case "usurper": // 夺权者X:蓝白长钉无人机(P1两架/P2四架僚机);P2周期性巨宽核心激光(压制其他攻击)
|
||||
if(ph===0){
|
||||
if(!b.fn0){b.fn0=1;spawnFunnels(b,2);}
|
||||
for(const sd of[-1,1]){const px2=b.x+sd*18,py2=b.y+9,a6=Math.atan2(ap2.y-py2,ap2.x-px2);
|
||||
for(const sd of[-1,1]){const px2=b.x+sd*50,py2=b.y+8,a6=Math.atan2(ap2.y-py2,ap2.x-px2);
|
||||
ebul(px2,py2,a6,4.4,"dartS",15);} // 发射点=最下甲板炮口(与drawUsurper同源)
|
||||
b.mainT=Math.round(46/fm);
|
||||
}else{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user