From 14647da88b6d2d3dcb990ac942b6fa3e1b383f84 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Thu, 6 Aug 2026 03:37:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=BA=E6=9D=83=E8=80=85X=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E9=87=8D=E8=AE=BE=E8=AE=A1+=E9=AD=94=E7=A2=9F=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=EF=BC=9A=E2=91=A0=E5=8E=BB=E7=9C=BC=E7=9D=9B=E6=94=B9?= =?UTF-8?q?=E6=9C=BA=E6=A2=B0=E5=8F=8D=E5=BA=94=E7=8E=AF=EF=BC=88=E5=A4=96?= =?UTF-8?q?=E7=8E=AF+=E6=97=8B=E8=BD=AC=E5=BC=A7=E6=AE=B5+=E5=86=85?= =?UTF-8?q?=E8=8A=AF=E6=90=8F=E5=8A=A8=EF=BC=8C=E9=9D=9E=E7=94=9F=E7=89=A9?= =?UTF-8?q?=E7=9C=BC=EF=BC=89=EF=BC=9BP1=E5=8A=A0=E5=8E=9A=E5=8A=A0?= =?UTF-8?q?=E5=AE=BD=EF=BC=88=E4=B8=89=E6=AE=B5=E5=BC=8F=E5=AE=BD=E5=A1=94?= =?UTF-8?q?+=E6=8C=87=E6=8C=A5=E5=A1=94+=E6=9C=BA=E8=85=B9=E7=82=AE?= =?UTF-8?q?=E5=88=97+=E8=A3=85=E7=94=B2=E9=93=86=E9=92=89=EF=BC=89?= =?UTF-8?q?=E5=81=9A=E9=9C=B8=E6=B0=94=EF=BC=9BP2=E6=94=B9=E7=B2=97?= =?UTF-8?q?=E5=A3=AE=E5=AE=BD=E7=BF=BC=E6=88=98=E6=9C=BA=EF=BC=88=E7=BF=BC?= =?UTF-8?q?=E5=B1=95=C2=B130=E5=90=8E=E6=8E=A0=E7=BF=BC+=E8=93=9D=E7=81=AF?= =?UTF-8?q?=E5=B8=A6+=E5=8E=9A=E6=9C=BA=E8=BA=AB+=E4=B8=89=E5=BC=95?= =?UTF-8?q?=E6=93=8E=EF=BC=89=EF=BC=8C=E4=B8=8D=E5=86=8D=E7=BB=86=E7=98=A6?= =?UTF-8?q?=E3=80=82=E2=91=A1=E9=AD=94=E7=A2=9F=E8=8A=82=E9=97=B4=E7=BA=A2?= =?UTF-8?q?=E5=8F=91=E5=85=89=E6=9D=A1=E5=BE=84=E5=90=91=E5=AF=B9=E9=BD=90?= =?UTF-8?q?+=E8=83=BD=E9=87=8F=E7=AA=97=E9=9A=8F=E6=89=87=E5=8C=BA?= =?UTF-8?q?=E8=A7=92=E5=BA=A6=E6=97=8B=E8=BD=AC+=E4=B8=89=E5=A3=B3?= =?UTF-8?q?=E6=9D=BF=E5=B7=A6=E5=8F=B3=E9=95=9C=E5=83=8F=E5=AF=B9=E7=A7=B0?= =?UTF-8?q?=E3=80=82=E4=BB=85=E8=AF=AD=E6=B3=95=E6=A3=80=E6=9F=A5=E9=80=9A?= =?UTF-8?q?=E8=BF=87=EF=BC=8C=E6=9C=AA=E8=BF=90=E8=A1=8C=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star-raid/js/boss_art.js | 74 +++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/star-raid/js/boss_art.js b/star-raid/js/boss_art.js index cec10e5..fe898bb 100644 --- a/star-raid/js/boss_art.js +++ b/star-raid/js/boss_art.js @@ -76,33 +76,55 @@ 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抛甲板露紧凑钻石机身(小巧灵活) ---- - 变形=甲板整体抛离旋转飞走(带轨迹,爆甲原则)+紧凑机身渐显(壳下常存);参考血条观察: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;ctx.scale(ds,ds); - poly([0,46,-11,6,-7,-30,0,-40,7,-30,11,6],"#e8f4ff"); - poly([0,46,11,6,7,-30,0,-40],"#9fb0c6"); - poly([-7,-28,-26,-38,-20,-22,-7,-25],"#c0cddd");poly([7,-28,26,-38,20,-22,7,-25],"#c0cddd"); - circ(0,-12,6.5,fl||"#43b8ff");circ(0,-12,3.5,"#bfefff"); - circ(clamp((G.p.x-b.x)*0.03,-2,2),-12,1.6,"#0a2a44"); // 瞳孔追玩家 - px(-1.5,-30,3,14,"#43b8ff");px(-1.5,-2,3,26,"#43b8ff"); - for(const sd of[-1,1])px(sd*5-1.5,-44-(t%4),3,3+(t%4),t%6<3?"#7fd8ff":"#43b8ff"); // 引擎尾焰抖动 + 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巨舰(变形=甲板抛离飞走+舰体淡出) —— if(ph2===0||mp!==null){const hullA=1-jt; if(hullA>0.02){ctx.save();ctx.globalAlpha=hullA; - // 主舰体:三段层叠塔 - poly([0,34,-16,10,-13,-24,-7,-38,7,-38,13,-24,16,10],"#d8e4f0"); - poly([0,34,16,10,13,-24,7,-38,0,-38],"#9fb0c6"); - px(-13,-24,26,2,"#5a6c80");px(-11,-8,22,2,"#5a6c80"); // 层间板缝 - px(-16,10,32,3,"#e8f4ff"); // 底缘受光 - // 蓝色大眼核心(同心3层+瞳孔追踪;巨宽激光期高亮) - circ(0,-14,8,"#0d2244");circ(0,-14,6.5,fl||"#43b8ff");circ(0,-14,3.2,"#bfefff"); - circ(clamp((G.p.x-b.x)*0.03,-2.5,2.5),-14,1.5,"#0a2a44"); - if(b.laserT>0){ctx.globalAlpha=hullA*0.5;circ(0,-14,10,"#7ce9ff");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"); @@ -118,6 +140,7 @@ function drawUsurper(b,t,fl,ph2,mp){ 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");} @@ -143,9 +166,11 @@ function drawSaucer(b,t,fl,ph2,mp){ poly([0,-19,6,-14,4,-8,-4,-8,-6,-14],k%2?"#241430":"#2a1a3a"); // 扇区装甲(明暗交替) px(-0.5,-19,1,11,open>0?"#ff3355":"#7a1622"); // 扇区间裂纹(P2转亮红) ctx.restore();} - for(let k=0;k<8;k++){const a=(k+0.5)*TAU/8; // 红色六边形能量窗(呼吸明灭,P2+更亮) + for(let k=0;k<8;k++){const a=(k+0.5)*TAU/8; // 红色六边形能量窗(随扇区角度旋转,呼吸明灭) ctx.globalAlpha=(0.3+0.3*Math.sin(t*0.08+k*1.1))*(0.5+0.5*eyeG); - circ(Math.sin(a)*12.5,-Math.cos(a)*12.5,2.2,"#ff3355");ctx.globalAlpha=1;} + ctx.save();ctx.translate(Math.sin(a)*12.5,-Math.cos(a)*12.5);ctx.rotate(a); + px(-2,-1,4,2,"#ff3355");px(-1,-2,2,4,"#ff3355"); + ctx.restore();ctx.globalAlpha=1;} ctx.restore(); // —— 眼窝(常存)+紫红魔眼(P2点亮;竖瞳追踪玩家,P3瞳孔收成竖缝) —— px(-11,-5,7,6,"#241430");px(4,-5,7,6,"#241430"); @@ -164,13 +189,14 @@ function drawSaucer(b,t,fl,ph2,mp){ ctx.beginPath();ctx.arc(0,0,R,sa0,sa1);ctx.stroke(); ctx.strokeStyle="#55336e";ctx.lineWidth=4.5; ctx.beginPath();ctx.arc(0,0,R,sa0,sa1);ctx.stroke();} - for(let k=0;k<5;k++){const ag=a0+(k+1)*(a1-a0)/6; // 节间红发光条(呼吸明灭) + for(let k=0;k<5;k++){const ag=a0+(k+1)*(a1-a0)/6; // 节间红发光条(径向对齐,呼吸明灭) ctx.globalAlpha=0.45+0.4*Math.sin(t*0.09+k); - px(Math.cos(ag)*R-1,Math.sin(ag)*R-4,2,8,"#ff3355");ctx.globalAlpha=1;} + ctx.save();ctx.translate(Math.cos(ag)*R,Math.sin(ag)*R);ctx.rotate(ag); + px(-4,-1,8,2,"#ff3355");ctx.restore();ctx.globalAlpha=1;} const hL=3+open*26; // 半环下端伸长变尖:圆环下半部分延续为朝下的锥刺(同一几何体) poly([-6.5,R,6.5,R,2.5,R+hL*0.55,0,R+hL,-2.5,R+hL*0.55],"#2a1a3a"); poly([-3.5,R,3.5,R,1.2,R+hL*0.5,0,R+hL*0.8,-1.2,R+hL*0.5],"#55336e"); - for(let k=0;k<3;k++){const aa=a0+(0.35+k*0.2)*(a1-a0); + for(let k=0;k<3;k++){const aa=a0+(sd<0?0.35+k*0.2:0.65-k*0.2)*(a1-a0); // 左右半环镜像对称 const rx=Math.cos(aa),ry=Math.sin(aa),tx2=-ry,ty2=rx; const bl=2+9*fo; // 铆钉→尖刺连续伸长 poly([rx*(R+5)+tx2*2.5,ry*(R+5)+ty2*2.5, rx*(R+5)-tx2*2.5,ry*(R+5)-ty2*2.5, rx*(R+5+bl),ry*(R+5+bl)],fo>0.6?(fl||"#ff3355"):"#241430");