From 3ea4bc5a736117ecc5d4a73b99886b7eb8a3d326 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Wed, 5 Aug 2026 23:05:02 +0800 Subject: [PATCH] =?UTF-8?q?=E9=BB=91=E7=9F=B3=E8=A6=81=E5=A1=9E=E9=87=8D?= =?UTF-8?q?=E5=81=9Av2=EF=BC=9A=E4=BF=AF=E8=A7=86=E4=BA=94=E8=8A=92?= =?UTF-8?q?=E8=A3=85=E7=94=B2=E6=98=9F=E5=A0=A1=EF=BC=8C=E5=9B=9B=E5=B1=82?= =?UTF-8?q?=E7=9F=B3=E8=89=B2=E9=80=92=E8=BF=9B+=E8=87=82=E9=97=B4?= =?UTF-8?q?=E5=B0=8F=E5=A0=A1+=E5=90=8C=E5=BF=83=E5=A0=A1=E5=9E=92+?= =?UTF-8?q?=E7=AA=97=E7=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 造型:五芒装甲臂(双瓣外壳+板面层次+棱线高光+臂尖绿晶)+臂间小堡次剪影+同心八角堡垒+堡沿窗火闪烁+四瓣穹顶覆盖亚空间核心;去掉俯视图不该有的尖塔 - 攻击:单臂光矛依序绕堡充能与全体臂尖黑石碎片幕交替(40帧/轮);新增shardB碎片弹(深色绿芯、按飞行方向偏转);P2亚空间主炮不变 - 二阶段:装甲瓣沿中线微开+穹顶对角滑开,露出壳下常存绿光 --- js/combat.js | 2 +- js/enemies.js | 13 ++++++++----- js/render.js | 33 +++++++++++++++++++-------------- js/sprites.js | 3 ++- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/js/combat.js b/js/combat.js index 434143b..bbf963c 100644 --- a/js/combat.js +++ b/js/combat.js @@ -255,7 +255,7 @@ function collide(){ // Boss光束:预警后伤害(点-线段距离判定,每束有命中冷却) for(const bm of G.bbeams){ if(bm.src&&G.boss&&bm.src.b===G.boss){let ox=bm.src.ox||0,oy=bm.src.oy||0; - if(bm.src.arm!==undefined){const ra=G.boss.t*0.0032+bm.src.arm*TAU/5;ox=Math.sin(ra)*31;oy=-Math.cos(ra)*31;} // 黑石要塞:臂尖随整体旋转 + if(bm.src.arm!==undefined){const ra=G.boss.t*0.0032+bm.src.arm*TAU/5;ox=Math.sin(ra)*32;oy=-Math.cos(ra)*32;} // 黑石要塞:臂尖随整体旋转 bm.x1=G.boss.x+ox;bm.y1=G.boss.y+oy;if(bm.src.followX2)bm.x2=bm.x1;} // 发射点跟随Boss炮台 if(bm.tele>0){bm.tele--;continue;} bm.life--; diff --git a/js/enemies.js b/js/enemies.js index cee8559..343940e 100644 --- a/js/enemies.js +++ b/js/enemies.js @@ -330,12 +330,15 @@ function bossMain(b,def,fm){ b.rokC=(b.rokC||0)+1; if(b.rokC%(ph?2:3)===0){const mb=ebul(b.x,b.y+26,a0,1.05,"orbO",26);mb.scale=2.4;mb.r=6;SFX.warn();} b.mainT=Math.round((ph?80:95)/fm);break; - case "blackstone": { // 黑石要塞:五箭头臂光矛轮换(臂尖随缓慢旋转跟随);P2周期性亚空间主炮(压制其他攻击) + case "blackstone": { // 黑石要塞:单臂光矛依序绕堡充能 + 全体臂尖黑石碎片幕 交替;P2周期性亚空间主炮(压制其他攻击) b.armC=(b.armC||0)+1; - const rot=b.t*0.0032,arms=[]; - for(let k=0;k<5;k++){const a=rot+k*TAU/5;arms.push([Math.sin(a)*31,-Math.cos(a)*31]);} - for(const ai of[b.armC%5,(b.armC+2)%5])bossBeam(b.x+arms[ai][0],b.y+arms[ai][1],b.x+arms[ai][0]*1.5,H+8,3.5,"#5cff9d",20,22,18,{b,arm:ai}); - b.mainT=Math.round(66/fm); + const rot=b.t*0.0032; + if(b.armC%2===1){const ai=(b.armC>>1)%5; // 单臂光矛(依序轮换) + const a=rot+ai*TAU/5,tx=Math.sin(a)*32,ty=-Math.cos(a)*32; + bossBeam(b.x+tx,b.y+ty,b.x+tx*2.2,H+8,4,"#5cff9d",22,24,18,{b,arm:ai}); + }else for(let k=0;k<5;k++){const a=rot+k*TAU/5,tx=Math.sin(a)*32,ty=-Math.cos(a)*32; // 全体臂尖碎片幕 + for(let j=-1;j<=1;j++)ebul(b.x+tx,b.y+ty,Math.PI/2+Math.sin(a)*0.5+j*0.16,1.7,"shardB",13);} + b.mainT=Math.round(40/fm); if(ph>=1&&(!b.plT||b.plT<=0)){bossBeam(b.x,b.y+8,b.x,H+8,16,"#5cff9d",46,70,28,{b,ox:0,oy:8,followX2:true}); b.laserT=120;b.plT=Math.round(380/fm);SFX.warn();} break;} diff --git a/js/render.js b/js/render.js index 62bee9c..b599cf4 100644 --- a/js/render.js +++ b/js/render.js @@ -126,24 +126,29 @@ function drawBoss(){ ctx.globalAlpha=0.35+0.45*op; px(-22,-26,3,cl,fl||"#ff5a2a");px(8,-16,3,cl*0.8,fl||"#ff5a2a");px(-6,0,3,cl*0.6,fl||"#ff5a2a"); ctx.globalAlpha=1;} - }else if(b.idx===9){ // 黑石要塞:五个箭头构造+中央尖顶,整体缓慢旋转;二阶段外壳微微打开露内光 + }else if(b.idx===9){ // 黑石要塞:五芒黑石装甲星堡(俯视),缓慢旋转;二阶段外壳裂瓣微开露亚空间绿光 const op=mp!==null?mp:(ph2>=1?1:0); ctx.save();ctx.rotate(t*0.0032); // 整体缓慢旋转(光矛臂尖同步跟随) for(let k=0;k<5;k++){ctx.save();ctx.rotate(k*TAU/5); - poly([-7,3,-3,-23,0,-29,3,-23,7,3,3,5,-3,5],"#2fae6a"); // 箭头内芯荧光(壳下常存) - ctx.save();ctx.translate(0,-op*4); // 二阶段外壳向外微移露缝 - poly([-9,2,-4,-25,0,-31,4,-25,9,2,4,6,-4,6],"#1c2230"); // 黑石外壳 - px(-2,-26,4,11,"#2e3a4e"); // 壳面石纹 - ctx.restore(); + px(-2,-26,4,24,"#2fae6a"); // 臂内亚空间光芯(壳下常存,裂开后露出) + for(const sd of[-1,1]){ctx.save();ctx.translate(sd*op*2.5,0); // 装甲外壳两瓣沿中线微开 + poly([0,-32,sd*6,-20,sd*12,6,sd*6,12,0,10],"#161d2c"); + poly([0,-28,sd*4,-18,sd*8,4,sd*4,8,0,6],"#232f47"); // 板面层次 + px(sd<0?-8:5,-12,3,9,"#3d4f73"); // 棱线高光 + ctx.restore();} + px(-1.5,-34,3,4,fl||"#5cff9d"); // 臂尖绿晶 + ctx.restore();} + for(let k=0;k<5;k++){ctx.save();ctx.rotate((k+0.5)*TAU/5); // 臂间小堡(次层剪影) + poly([0,-13,5,-4,-5,-4],"#0f1622"); + ctx.restore();} + poly([0,-17,12,-12,17,0,12,12,0,17,-12,12,-17,0,-12,-12],"#161d2c"); // 中央八角堡垒·外环 + poly([0,-14,10,-10,14,0,10,10,0,14,-10,10,-14,0,-10,-10],"#232f47"); // 内环 + for(let i=0;i<8;i++){const a2=i*TAU/8+TAU/16;px(Math.cos(a2)*14-1,Math.sin(a2)*14-1,2,2,t%40<20?"#3d4f73":"#24304a");} // 堡沿窗火 + circ(0,0,7,"#1f6a44");circ(0,0,4.5,fl||"#5cff9d");circ(0,0,2,"#d6ffe8"); // 亚空间核心(穹顶之下常存) + for(let k=0;k<4;k++){ctx.save();ctx.rotate(k*Math.PI/2+Math.PI/4);ctx.translate(0,-op*4); // 四瓣穹顶对角滑开 + poly([0,0,-5,-2,0,-9,5,-2],"#1c2434"); ctx.restore();} ctx.restore(); - circ(0,0,6,"#1f6a44");circ(0,0,3.5,fl||"#5cff9d"); // 中心内芯(壳下常存) - for(const sd of[-1,1]){ctx.save();ctx.translate(sd*op*3,0); // 中心区外壳两瓣微开 - poly([0,-14,sd*12,-10,sd*14,0,sd*12,10,0,14],"#141a26"); - ctx.restore();} - poly([-4,-12,4,-12,2,-38,-2,-38],"#1c2230"); // 中央尖顶(哥特塔) - px(-3,-31,6,3,"#2e3a4e");px(-3,-22,6,3,"#2e3a4e"); - px(-1,-41,2,4,fl||"#5cff9d"); // 尖顶绿晶 }else if(b.idx===10){ // 泰伦母舰:生物质长舰+前触手;二阶段背甲滑开露荧光器官、触手伸长 const op=mp!==null?mp:(ph2>=1?1:0); const tl=13+op*11; // 触手连续伸长 @@ -389,7 +394,7 @@ function render(){ if(b.scale&&b.scale!==1){const sp=SPR[b.spr]; // 成长弹(花弹) ctx.save();ctx.translate(Math.round(b.x),Math.round(b.y));ctx.scale(b.scale,b.scale); ctx.drawImage(sp,-Math.round(sp.width/2),-Math.round(sp.height/2));ctx.restore();} - else if(b.spr==="dartS"||b.spr==="dartB"||b.spr==="dartP"){const sp=SPR[b.spr]; // 长条弹:按飞行方向偏转 + else if(b.spr==="dartS"||b.spr==="dartB"||b.spr==="dartP"||b.spr==="shardB"){const sp=SPR[b.spr]; // 长条弹:按飞行方向偏转 ctx.save();ctx.translate(Math.round(b.x),Math.round(b.y)); ctx.rotate(Math.atan2(b.vy,b.vx)-Math.PI/2); ctx.drawImage(sp,-Math.round(sp.width/2),-Math.round(sp.height/2));ctx.restore();} diff --git a/js/sprites.js b/js/sprites.js index e23f521..aad3bbd 100644 --- a/js/sprites.js +++ b/js/sprites.js @@ -99,7 +99,7 @@ function orb(c1,c2){ ".HHCCCHH.", "...HHH..."],{H:halo,W:"#ffffff",C:c2}); } -const BHALO={orbR:"#ff5566",orbP:"#b05ce8",orbG:"#5cff9d",orbO:"#ff9a3d",dartB:"#3a8cd8",flowr:"#ff8fc8",dartS:"#5ec4ff",dartP:"#b98cff",rockb:"#8a7a62"}; +const BHALO={orbR:"#ff5566",orbP:"#b05ce8",orbG:"#5cff9d",orbO:"#ff9a3d",dartB:"#3a8cd8",flowr:"#ff8fc8",dartS:"#5ec4ff",dartP:"#b98cff",rockb:"#8a7a62",shardB:"#5cff9d"}; SPR.dartB=bake(["KCCCK",".CCC.",".CWC.","..C.."],{K:"#0d2433",C:"#3a8cd8",W:"#cfeaff"}); // 蓝色锥形敌弹(Boss弹幕) SPR.flowr=bake([ "....P....",".P..P..P.","..PPPPP..",".PPWWWPP.","PPPWWWPPP", @@ -109,6 +109,7 @@ SPR.dartS=bake(["CC","CC","CC","CC","CC","CC","CC","CC","CC","CC","WW","WW"], {W:"#f2fbff",C:"#5ec4ff"}); // 夺权者X:蓝白细长钉(2×12,白尖朝运动方向) SPR.dartP=bake(["KPPPK",".PPP.",".PWP.","..P.."],{K:"#2a1040",P:"#b98cff",W:"#ead9ff"}); // 暗黑魔碟:紫锥弹 SPR.rockb=bake([".KKK.","KSSSK","KSWSK","KSSSK",".KKK."],{K:"#3a2f26",S:"#8a7a62",W:"#c8bca8"}); // 兽人战斗月亮:碎石弹 +SPR.shardB=bake([".K.","KSK","KSK","KWK",".K."],{K:"#1a2436",S:"#46587a",W:"#5cff9d"}); // 黑石要塞:黑石碎片(绿芯,按飞行方向偏转) SPR.orbR=orb("#ffe9e9","#ff5566");SPR.orbP=orb("#f4e9ff","#b05ce8"); SPR.orbG=orb("#e9ffe9","#5cff9d");SPR.orbO=orb("#fff4d9","#ff9a3d"); SPR.plasma=orb("#e9f8ff","#43b8ff");