黑石要塞重做v2:俯视五芒装甲星堡,四层石色递进+臂间小堡+同心堡垒+窗火
- 造型:五芒装甲臂(双瓣外壳+板面层次+棱线高光+臂尖绿晶)+臂间小堡次剪影+同心八角堡垒+堡沿窗火闪烁+四瓣穹顶覆盖亚空间核心;去掉俯视图不该有的尖塔 - 攻击:单臂光矛依序绕堡充能与全体臂尖黑石碎片幕交替(40帧/轮);新增shardB碎片弹(深色绿芯、按飞行方向偏转);P2亚空间主炮不变 - 二阶段:装甲瓣沿中线微开+穹顶对角滑开,露出壳下常存绿光
This commit is contained in:
parent
9911714628
commit
3ea4bc5a73
@ -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--;
|
||||
|
||||
@ -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;}
|
||||
|
||||
33
js/render.js
33
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();}
|
||||
|
||||
@ -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");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user