{"id":26317,"date":"2026-07-23T11:26:06","date_gmt":"2026-07-23T02:26:06","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=26317"},"modified":"2026-07-23T11:26:08","modified_gmt":"2026-07-23T02:26:08","slug":"star_breaker_stg_stage5_power_barrage-html","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=26317","title":{"rendered":"star_breaker_stg_stage5_power_barrage.html"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"ja\">\n&lt;head>\n&lt;meta charset=\"UTF-8\">\n&lt;meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n&lt;title>STAR BREAKER - 5 STAGE STG&lt;\/title>\n&lt;style>\n:root{--cyan:#55efff;--pink:#ff4fd8;--yellow:#ffe66d;--bg:#02040e}\n*{box-sizing:border-box}\nhtml,body{margin:0;width:100%;height:100%;overflow:hidden;background:#02040e;color:#fff;font-family:system-ui,-apple-system,\"Yu Gothic UI\",sans-serif}\nbody{display:grid;place-items:center;background:radial-gradient(circle at 50% 20%,#17265e,#050817 50%,#010208)}\n#wrap{position:relative;width:min(100vw,900px);height:min(100vh,960px);aspect-ratio:3\/4;overflow:hidden;border:1px solid #55efff55;box-shadow:0 0 36px #55efff22;background:#02040e}\ncanvas{display:block;width:100%;height:100%;touch-action:none;cursor:crosshair}\n#hud{position:absolute;inset:0;pointer-events:none;font-weight:900;text-shadow:0 0 8px #55efff}\n.top{position:absolute;top:12px;left:16px;right:16px;display:flex;justify-content:space-between;gap:12px;font-size:clamp(12px,2vw,19px)}\n#stageLabel{position:absolute;top:45px;left:0;right:0;text-align:center;color:#bff8ff;letter-spacing:.22em}\n#bossWrap{display:none;position:absolute;top:73px;left:9%;width:82%}\n#bossName{text-align:center;font-size:13px;margin-bottom:5px;color:#ffd4f5}\n.bar{height:13px;border:1px solid #ffffffaa;background:#ffffff12}\n#bossHp{height:100%;width:100%;background:linear-gradient(90deg,#ff4fd8,#ff9a3d)}\n.overlay{position:absolute;inset:0;display:grid;place-items:center;background:linear-gradient(#02040e33,#02040ecc);z-index:5}\n.panel{width:min(88%,650px);padding:clamp(22px,5vw,44px);text-align:center;background:#081027e8;border:1px solid #55efff88;box-shadow:0 0 28px #55efff33;backdrop-filter:blur(7px)}\nh1{margin:0 0 10px;font-size:clamp(38px,8vw,76px);line-height:.9;color:#fff;text-shadow:0 0 9px #fff,0 0 22px #55efff,4px 4px 0 #ff4fd8}\n.sub{color:#8deeff;letter-spacing:.25em;margin-bottom:22px;font-weight:800}\n#message{line-height:1.8;color:#ddebff}\nbutton{margin:20px 7px 0;padding:14px 28px;border:0;border-radius:999px;color:#fff;font-weight:900;font-size:17px;cursor:pointer;background:linear-gradient(90deg,#55efff,#7277ff,#ff4fd8);box-shadow:0 0 18px #55efff66}\nbutton.secondary{background:#252c46;box-shadow:none;border:1px solid #ffffff44}\nbutton:hover{filter:brightness(1.15);transform:scale(1.03)}\n.small{margin-top:18px;padding-top:14px;border-top:1px solid #ffffff22;color:#b7c9dd;font-size:13px;line-height:1.7}\n#mobile{position:absolute;left:0;right:0;bottom:12px;display:none;justify-content:space-between;padding:0 14px;pointer-events:none;z-index:4}\n.group{display:flex;gap:8px;pointer-events:auto}.touch{width:58px;height:58px;margin:0;padding:0;border-radius:50%;opacity:.62;font-size:20px}\n@media(pointer:coarse){#mobile{display:flex}}\n&lt;\/style>\n&lt;\/head>\n&lt;body>\n&lt;div id=\"wrap\">\n&lt;canvas id=\"game\" width=\"720\" height=\"960\">&lt;\/canvas>\n\n&lt;div id=\"hud\">\n  &lt;div class=\"top\">\n    &lt;div>SCORE &lt;span id=\"score\">0000000&lt;\/span>&lt;\/div>\n    &lt;div>HI &lt;span id=\"high\">0000000&lt;\/span>&lt;\/div>\n    &lt;div>POWER &lt;span id=\"power\">1&lt;\/span>&lt;\/div>\n  &lt;\/div>\n  &lt;div id=\"stageLabel\">STAGE 1 \/ 5&lt;\/div>\n  &lt;div id=\"bossWrap\">\n    &lt;div id=\"bossName\">BOSS&lt;\/div>\n    &lt;div class=\"bar\">&lt;div id=\"bossHp\">&lt;\/div>&lt;\/div>\n  &lt;\/div>\n&lt;\/div>\n\n&lt;div id=\"overlay\" class=\"overlay\">\n  &lt;div class=\"panel\">\n    &lt;h1 id=\"title\">STAR&lt;br>BREAKER&lt;\/h1>\n    &lt;div class=\"sub\" id=\"subtitle\">5 STAGE MISSION&lt;\/div>\n    &lt;div id=\"message\">\u51685\u30b9\u30c6\u30fc\u30b8\u3092\u7a81\u7834\u3057\u3001\u6700\u7d42\u8981\u585e\u3092\u7834\u58ca\u305b\u3088\u3002&lt;br>\u6575\u5f3e\u306b\u4e00\u767a\u3067\u3082\u5f53\u305f\u308b\u3068\u7206\u767a\u3057\u3066\u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc\u3002&lt;br>POWER\u30a2\u30a4\u30c6\u30e0\u3067\u30b7\u30e7\u30c3\u30c8\u3092\u6700\u59275\u6bb5\u968e\u307e\u3067\u5f37\u5316\u3002&lt;\/div>\n    &lt;div id=\"buttons\">\n      &lt;button id=\"startBtn\">GAME START&lt;\/button>\n    &lt;\/div>\n    &lt;div class=\"small\">PC\uff1aWASD \/ \u77e2\u5370\u30ad\u30fc \/ \u30de\u30a6\u30b9\u30c9\u30e9\u30c3\u30b0\u3067\u79fb\u52d5\u3000\uff5c\u3000P\uff1a\u4e00\u6642\u505c\u6b62&lt;br>\u30b9\u30de\u30db\uff1a\u753b\u9762\u30c9\u30e9\u30c3\u30b0\u3001\u307e\u305f\u306f\u4e0b\u306e\u79fb\u52d5\u30dc\u30bf\u30f3&lt;\/div>\n  &lt;\/div>\n&lt;\/div>\n\n&lt;div id=\"mobile\">\n  &lt;div class=\"group\">&lt;button class=\"touch\" data-key=\"left\">\u25c0&lt;\/button>&lt;button class=\"touch\" data-key=\"right\">\u25b6&lt;\/button>&lt;\/div>\n  &lt;div class=\"group\">&lt;button class=\"touch\" data-key=\"up\">\u25b2&lt;\/button>&lt;button class=\"touch\" data-key=\"down\">\u25bc&lt;\/button>&lt;\/div>\n&lt;\/div>\n&lt;\/div>\n\n&lt;script>\n(()=>{\n\"use strict\";\nconst canvas=document.getElementById(\"game\"),ctx=canvas.getContext(\"2d\");\nconst W=720,H=960;\nconst scoreEl=document.getElementById(\"score\"),highEl=document.getElementById(\"high\"),powerEl=document.getElementById(\"power\");\nconst stageLabel=document.getElementById(\"stageLabel\"),bossWrap=document.getElementById(\"bossWrap\"),bossName=document.getElementById(\"bossName\"),bossHp=document.getElementById(\"bossHp\");\nconst overlay=document.getElementById(\"overlay\"),title=document.getElementById(\"title\"),subtitle=document.getElementById(\"subtitle\"),message=document.getElementById(\"message\"),buttons=document.getElementById(\"buttons\");\n\nlet running=false,paused=false,dead=false,last=0,time=0,score=0,high=Number(localStorage.getItem(\"starBreaker5High\")||0);\nlet stage=1,stageTime=0,waveTimer=0,wavesSpawned=0,bossActive=false,transition=false,shake=0,flash=0;\nlet pointer=false;\nconst keys={},bullets=&#91;],enemyBullets=&#91;],enemies=&#91;],particles=&#91;],powerups=&#91;],stars=&#91;];\n\nconst stageData=&#91;\n {name:\"ORBITAL FRONT\",duration:23,boss:\"IRON TALON\",hp:260,bg:&#91;\"#07112c\",\"#02040e\"]},\n {name:\"CRIMSON NEBULA\",duration:25,boss:\"SCARLET MANTA\",hp:380,bg:&#91;\"#2b071c\",\"#07030b\"]},\n {name:\"ASTEROID BELT\",duration:27,boss:\"GRAVITY GOLEM\",hp:520,bg:&#91;\"#241b10\",\"#050403\"]},\n {name:\"VOID TEMPLE\",duration:29,boss:\"ABYSS SERAPH\",hp:700,bg:&#91;\"#16072a\",\"#030109\"]},\n {name:\"FINAL FORTRESS\",duration:32,boss:\"OMEGA EMPRESS\",hp:980,bg:&#91;\"#051b26\",\"#010408\"]}\n];\n\nconst player={x:W\/2,y:H-120,r:11,speed:410,cool:0,rate:.12,power:1,maxPower:5,inv:0,tilt:0};\nfor(let i=0;i&lt;150;i++)stars.push({x:Math.random()*W,y:Math.random()*H,z:Math.random()*2.5+.5,a:Math.random()*.8+.2});\n\nfunction clearAll(){bullets.length=enemyBullets.length=enemies.length=particles.length=powerups.length=0}\nfunction updateHUD(){\n scoreEl.textContent=String(Math.floor(score)).padStart(7,\"0\");\n highEl.textContent=String(Math.floor(high)).padStart(7,\"0\");\n powerEl.textContent=player.power>=player.maxPower?\"MAX\":player.power;\n stageLabel.textContent=`STAGE ${stage} \/ 5\u3000${stageData&#91;stage-1].name}`;\n}\nfunction reset(){\n clearAll();stage=1;stageTime=0;waveTimer=0;wavesSpawned=0;bossActive=false;transition=false;dead=false;paused=false;\n score=0;time=0;shake=0;flash=0;player.x=W\/2;player.y=H-120;player.cool=0;player.power=1;player.inv=1;\n bossWrap.style.display=\"none\";updateHUD();\n}\nfunction begin(){\n reset();running=true;overlay.style.display=\"none\";last=performance.now();requestAnimationFrame(loop);\n}\nfunction addScore(n){\n score+=n;if(score>high){high=score;localStorage.setItem(\"starBreaker5High\",String(Math.floor(high)))}updateHUD();\n}\nfunction burst(x,y,color,count=25,speed=260){\n for(let i=0;i&lt;count;i++){const a=Math.random()*Math.PI*2,s=Math.random()*speed+40;\n particles.push({x,y,vx:Math.cos(a)*s,vy:Math.sin(a)*s,life:Math.random()*.7+.3,max:1,size:Math.random()*6+2,color});\n }}\nfunction shoot(){\n let shots=&#91;];\n if(player.power===1)shots=&#91;{a:0,x:0,d:1}];\n if(player.power===2)shots=&#91;{a:-.10,x:-7,d:1},{a:.10,x:7,d:1}];\n if(player.power===3)shots=&#91;{a:-.18,x:-10,d:1},{a:0,x:0,d:2},{a:.18,x:10,d:1}];\n if(player.power===4)shots=&#91;{a:-.25,x:-15,d:2},{a:-.08,x:-5,d:2},{a:.08,x:5,d:2},{a:.25,x:15,d:2}];\n if(player.power>=5)shots=&#91;\n   {a:-.31,x:-18,d:2},{a:-.16,x:-10,d:2},{a:0,x:0,d:3},\n   {a:.16,x:10,d:2},{a:.31,x:18,d:2}\n ];\n shots.forEach(s=>bullets.push({\n   x:player.x+s.x,y:player.y-20,\n   vx:Math.sin(s.a)*230,vy:-820,\n   r:s.d>=3?7:5,dmg:s.d,power:player.power\n }));\n player.rate=Math.max(.065,.13-player.power*.013);\n}\nfunction spawnEnemy(type,x,y){\n const s=stage;\n if(type===\"scout\")enemies.push({type,x,y,r:19,hp:1+s,maxHp:1+s,vx:(Math.random()-.5)*130,vy:105+s*11,age:0,shot:1.2+Math.random()});\n if(type===\"zig\")enemies.push({type,x,y,r:22,hp:3+s,maxHp:3+s,vx:0,vy:80+s*7,age:Math.random()*5,shot:.9+Math.random()});\n if(type===\"tank\")enemies.push({type,x,y,r:32,hp:11+s*4,maxHp:11+s*4,vx:0,vy:42+s*3,age:0,shot:.7});\n}\nfunction spawnWave(){\n wavesSpawned++;\n const pattern=(wavesSpawned+stage)%4;\n if(pattern===0){for(let i=0;i&lt;7;i++)spawnEnemy(\"scout\",75+i*95,-40-i*34)}\n if(pattern===1){for(let i=0;i&lt;6;i++)spawnEnemy(\"zig\",90+i*108,-45-i*70)}\n if(pattern===2){spawnEnemy(\"tank\",W\/2,-70);for(let i=0;i&lt;4;i++)spawnEnemy(\"scout\",120+i*160,-160-i*40)}\n if(pattern===3){for(let i=0;i&lt;3;i++){spawnEnemy(\"zig\",170+i*190,-60-i*80);spawnEnemy(\"scout\",90+i*250,-190-i*50)}}\n}\nfunction spawnBoss(){\n bossActive=true;enemyBullets.length=0;\n const d=stageData&#91;stage-1];\n enemies.push({type:\"boss\",x:W\/2,y:-130,r:82,hp:d.hp,maxHp:d.hp,age:0,shot:.6,stage,vy:48});\n bossName.textContent=d.boss;bossHp.style.width=\"100%\";bossWrap.style.display=\"block\";\n}\nfunction addEnemyBullet(x,y,a,speed,r=7,color=\"#ff8ae7\"){\n enemyBullets.push({x,y,vx:Math.cos(a)*speed,vy:Math.sin(a)*speed,r,color});\n}\nfunction enemyShoot(e){\n const aim=Math.atan2(player.y-e.y,player.x-e.x);\n const base=145+stage*18;\n\n if(e.type===\"scout\"){\n   if(stage&lt;=2){\n     for(let i=-1;i&lt;=1;i++)addEnemyBullet(e.x,e.y,aim+i*.12,base,6,\"#ff8ae7\");\n   }else{\n     for(let i=-2;i&lt;=2;i++)addEnemyBullet(e.x,e.y,aim+i*.13,base+12,6,\"#ff8ae7\");\n   }\n }\n\n if(e.type===\"zig\"){\n   const count=5+stage;\n   for(let i=0;i&lt;count;i++){\n     const a=(i\/(count-1)-.5)*1.15+Math.PI\/2;\n     addEnemyBullet(e.x,e.y,a,145+stage*12,6,\"#9d8cff\");\n   }\n   addEnemyBullet(e.x,e.y,aim,210+stage*8,5,\"#ffffff\");\n }\n\n if(e.type===\"tank\"){\n   const n=10+stage*2;\n   for(let i=0;i&lt;n;i++){\n     const a=i*Math.PI*2\/n+e.age*.32;\n     addEnemyBullet(e.x,e.y,a,125+stage*10,7,\"#ffb25f\");\n   }\n   for(let i=-2;i&lt;=2;i++)addEnemyBullet(e.x,e.y,aim+i*.15,190+stage*10,6,\"#fff0a8\");\n }\n\n if(e.type===\"boss\"){\n   const ratio=e.hp\/e.maxHp;\n\n   if(e.stage===1){\n     for(let ring=0;ring&lt;2;ring++){\n       for(let i=-5;i&lt;=5;i++){\n         const a=aim+i*.12+(ring?0.055:0);\n         addEnemyBullet(e.x,e.y+35,a,195+ring*45,7,ring?\"#ffd1f4\":\"#ff78d8\");\n       }\n     }\n   }\n\n   if(e.stage===2){\n     const n=22;\n     for(let i=0;i&lt;n;i++){\n       const a=i*Math.PI*2\/n+e.age*.62;\n       addEnemyBullet(e.x,e.y,a,155+(i%2)*42,7,i%2?\"#ff7ac8\":\"#a884ff\");\n     }\n     for(let i=-2;i&lt;=2;i++)addEnemyBullet(e.x,e.y+25,aim+i*.13,235,6,\"#ffffff\");\n   }\n\n   if(e.stage===3){\n     for(let ring=0;ring&lt;3;ring++){\n       const n=12+ring*4;\n       for(let i=0;i&lt;n;i++){\n         const a=i*Math.PI*2\/n+e.age*(ring%2?-.42:.42);\n         addEnemyBullet(e.x,e.y,a,115+ring*42,8-ring,\"#ffb35f\");\n       }\n     }\n   }\n\n   if(e.stage===4){\n     for(let side=-1;side&lt;=1;side+=2){\n       for(let i=0;i&lt;9;i++){\n         const a=aim+side*(.08+i*.085)+Math.sin(e.age*1.8)*.18;\n         addEnemyBullet(e.x+side*45,e.y+20,a,205+i*6,6,\"#b477ff\");\n       }\n     }\n     if(ratio&lt;.5){\n       for(let i=0;i&lt;18;i++){\n         const a=i*Math.PI\/9-e.age*.55;\n         addEnemyBullet(e.x,e.y,a,175,7,\"#ff70dd\");\n       }\n     }\n   }\n\n   if(e.stage===5){\n     const n=ratio>.6?28:38;\n     for(let i=0;i&lt;n;i++){\n       const a=i*Math.PI*2\/n+e.age*.78;\n       addEnemyBullet(e.x,e.y,a,150+(i%4)*28,7,i%2?\"#ff4fd8\":\"#65eaff\");\n     }\n     for(let i=-5;i&lt;=5;i++)addEnemyBullet(e.x,e.y+42,aim+i*.095,250,6,\"#fff2a8\");\n     if(ratio&lt;.45){\n       for(let i=0;i&lt;20;i++){\n         const a=i*Math.PI\/10-e.age*1.05;\n         addEnemyBullet(e.x,e.y,a,225,5,\"#ffffff\");\n       }\n     }\n   }\n }\n}\nfunction collide(a,b){const dx=a.x-b.x,dy=a.y-b.y;return dx*dx+dy*dy&lt;(a.r+b.r)*(a.r+b.r)}\nfunction gameOver(){\n if(dead)return;dead=true;running=false;shake=34;flash=.75;\n burst(player.x,player.y,\"#ff4fd8\",120,430);burst(player.x,player.y,\"#ffe66d\",80,360);\n draw();\n setTimeout(()=>{\n  title.innerHTML=\"GAME&lt;br>OVER\";subtitle.textContent=\"SHIP DESTROYED\";\n  message.innerHTML=`\u6575\u5f3e\u306b\u547d\u4e2d\u3057\u3001\u6a5f\u4f53\u304c\u7206\u767a\u3057\u305f\u3002&lt;br>SCORE\uff1a&lt;b>${Math.floor(score).toLocaleString()}&lt;\/b>\u3000STAGE\uff1a&lt;b>${stage}&lt;\/b>`;\n  buttons.innerHTML='&lt;button id=\"retryBtn\">\u30ea\u30c8\u30e9\u30a4&lt;\/button>&lt;button id=\"quitBtn\" class=\"secondary\">\u3084\u3081\u308b&lt;\/button>';\n  overlay.style.display=\"grid\";\n  document.getElementById(\"retryBtn\").addEventListener(\"click\",begin);\n  document.getElementById(\"quitBtn\").addEventListener(\"click\",quitGame);\n },650);\n}\nfunction quitGame(){\n clearAll();dead=false;bossWrap.style.display=\"none\";\n title.innerHTML=\"STAR&lt;br>BREAKER\";subtitle.textContent=\"MISSION ABORTED\";\n message.innerHTML=\"\u30b2\u30fc\u30e0\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002&lt;br>\u3082\u3046\u4e00\u5ea6\u904a\u3076\u3068\u304d\u306f\u30b9\u30bf\u30fc\u30c8\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044\u3002\";\n buttons.innerHTML='&lt;button id=\"againBtn\">GAME START&lt;\/button>';\n document.getElementById(\"againBtn\").addEventListener(\"click\",begin);\n draw();\n}\nfunction stageClear(){\n transition=true;bossActive=false;bossWrap.style.display=\"none\";enemyBullets.length=0;clearAll();\n addScore(2500*stage);\n if(stage===5){running=false;title.innerHTML=\"ALL&lt;br>CLEAR\";subtitle.textContent=\"OMEGA FORTRESS DESTROYED\";\n  message.innerHTML=`\u51685\u30b9\u30c6\u30fc\u30b8\u5236\u8987\uff01&lt;br>FINAL SCORE\uff1a&lt;b>${Math.floor(score).toLocaleString()}&lt;\/b>`;\n  buttons.innerHTML='&lt;button id=\"retryAll\">\u3082\u3046\u4e00\u5ea6\u904a\u3076&lt;\/button>&lt;button id=\"quitAll\" class=\"secondary\">\u3084\u3081\u308b&lt;\/button>';\n  overlay.style.display=\"grid\";\n  document.getElementById(\"retryAll\").addEventListener(\"click\",begin);\n  document.getElementById(\"quitAll\").addEventListener(\"click\",quitGame);\n  return;\n }\n running=false;title.innerHTML=`STAGE ${stage}&lt;br>CLEAR`;subtitle.textContent=stageData&#91;stage-1].boss+\" DESTROYED\";\n message.innerHTML=`\u6b21\u306f STAGE ${stage+1}\u300c${stageData&#91;stage].name}\u300d`;\n buttons.innerHTML='&lt;button id=\"nextStage\">NEXT STAGE&lt;\/button>';\n overlay.style.display=\"grid\";\n document.getElementById(\"nextStage\").addEventListener(\"click\",()=>{\n   stage++;stageTime=0;waveTimer=0;wavesSpawned=0;transition=false;player.x=W\/2;player.y=H-120;player.inv=1.5;\n   updateHUD();overlay.style.display=\"none\";running=true;last=performance.now();requestAnimationFrame(loop);\n });\n}\nfunction update(dt){\n time+=dt;stageTime+=dt;if(player.inv>0)player.inv-=dt;if(shake>0)shake=Math.max(0,shake-dt*55);if(flash>0)flash=Math.max(0,flash-dt*1.7);\n stars.forEach(s=>{s.y+=(55+s.z*65+stage*8)*dt;if(s.y>H){s.y=-5;s.x=Math.random()*W}});\n let dx=0,dy=0;if(keys.ArrowLeft||keys.a||keys.left)dx--;if(keys.ArrowRight||keys.d||keys.right)dx++;if(keys.ArrowUp||keys.w||keys.up)dy--;if(keys.ArrowDown||keys.s||keys.down)dy++;\n const l=Math.hypot(dx,dy)||1;dx\/=l;dy\/=l;player.x+=dx*player.speed*dt;player.y+=dy*player.speed*dt;player.x=Math.max(25,Math.min(W-25,player.x));player.y=Math.max(95,Math.min(H-35,player.y));player.tilt+=(dx*.45-player.tilt)*Math.min(1,dt*10);\n player.cool-=dt;if(player.cool&lt;=0){shoot();player.cool=player.rate}\n if(!bossActive){\n   waveTimer-=dt;if(waveTimer&lt;=0){spawnWave();waveTimer=Math.max(2.5,4.6-stage*.28)}\n   if(stageTime>=stageData&#91;stage-1].duration)spawnBoss();\n }\n for(let i=bullets.length-1;i>=0;i--){const b=bullets&#91;i];b.x+=b.vx*dt;b.y+=b.vy*dt;if(b.y&lt;-30||b.x&lt;-30||b.x>W+30)bullets.splice(i,1)}\n for(let i=enemyBullets.length-1;i>=0;i--){const b=enemyBullets&#91;i];b.x+=b.vx*dt;b.y+=b.vy*dt;if(b.y>H+50||b.y&lt;-60||b.x&lt;-60||b.x>W+60){enemyBullets.splice(i,1);continue}if(player.inv&lt;=0&amp;&amp;collide(b,player)){enemyBullets.splice(i,1);gameOver();return}}\n for(let i=enemies.length-1;i>=0;i--){const e=enemies&#91;i];e.age+=dt;\n   if(e.type===\"scout\"){e.x+=e.vx*dt;e.y+=e.vy*dt;if(e.x&lt;30||e.x>W-30)e.vx*=-1}\n   if(e.type===\"zig\"){e.y+=e.vy*dt;e.x+=Math.sin(e.age*2.5)*125*dt}\n   if(e.type===\"tank\"){e.y+=e.vy*dt;e.x=W\/2+Math.sin(e.age*.85)*220}\n   if(e.type===\"boss\"){if(e.y&lt;165)e.y+=e.vy*dt;else e.x=W\/2+Math.sin(e.age*(.55+e.stage*.06))*245;bossHp.style.width=Math.max(0,e.hp\/e.maxHp*100)+\"%\"}\n   e.shot-=dt;if(e.shot&lt;=0&amp;&amp;e.y>0){enemyShoot(e);e.shot=e.type===\"boss\"?Math.max(.22,.62-stage*.065):e.type===\"tank\"?1.08:e.type===\"zig\"?.92:1.12}\n   for(let j=bullets.length-1;j>=0;j--){const b=bullets&#91;j];if(collide(b,e)){e.hp-=b.dmg;bullets.splice(j,1);burst(b.x,b.y,\"#ffe66d\",4,80);\n     if(e.hp&lt;=0){const boss=e.type===\"boss\";burst(e.x,e.y,boss?\"#ff4fd8\":\"#55efff\",boss?130:28,boss?430:230);shake=boss?30:7;\n       addScore(boss?5000*stage:e.type===\"tank\"?550:e.type===\"zig\"?220:100);\n       if(!boss){\n         const dropRate=e.type===\"tank\"?.60:e.type===\"zig\"?.32:.20;\n         if(Math.random()&lt;dropRate)powerups.push({x:e.x,y:e.y,r:15,vy:82,spin:0});\n       }\n       enemies.splice(i,1);if(boss){enemyBullets.length=0;setTimeout(stageClear,550)}break;\n     }}}\n   if(i&lt;enemies.length&amp;&amp;e.y>H+100)enemies.splice(i,1);\n   else if(i&lt;enemies.length&amp;&amp;player.inv&lt;=0&amp;&amp;collide(e,player)){gameOver();return}\n }\n for(let i=powerups.length-1;i>=0;i--){const p=powerups&#91;i];p.y+=p.vy*dt;p.spin+=dt*4;if(collide(p,player)){player.power=Math.min(player.maxPower,player.power+1);addScore(player.power>=player.maxPower?800:400);burst(p.x,p.y,\"#ffe66d\",20,190);powerups.splice(i,1);updateHUD()}else if(p.y>H+30)powerups.splice(i,1)}\n for(let i=particles.length-1;i>=0;i--){const p=particles&#91;i];p.x+=p.vx*dt;p.y+=p.vy*dt;p.vx*=.984;p.vy*=.984;p.life-=dt;if(p.life&lt;=0)particles.splice(i,1)}\n}\nfunction drawShip(){\n ctx.save();ctx.translate(player.x,player.y);ctx.rotate(player.tilt);if(player.inv>0&amp;&amp;Math.floor(player.inv*13)%2===0)ctx.globalAlpha=.3;\n ctx.shadowBlur=22;ctx.shadowColor=\"#55efff\";ctx.fillStyle=\"#e9fdff\";ctx.beginPath();ctx.moveTo(0,-27);ctx.lineTo(18,19);ctx.lineTo(0,10);ctx.lineTo(-18,19);ctx.closePath();ctx.fill();\n ctx.fillStyle=\"#ff4fd8\";ctx.beginPath();ctx.moveTo(0,-13);ctx.lineTo(7,11);ctx.lineTo(-7,11);ctx.closePath();ctx.fill();\n ctx.shadowColor=\"#ff9a3d\";ctx.fillStyle=\"#fff\";ctx.beginPath();ctx.moveTo(-7,15);ctx.lineTo(0,35+Math.random()*9);ctx.lineTo(7,15);ctx.closePath();ctx.fill();ctx.restore();\n}\nfunction drawEnemy(e){\n ctx.save();ctx.translate(e.x,e.y);\n if(e.type===\"boss\"){ctx.rotate(Math.sin(e.age*.8)*.07);ctx.shadowBlur=28;ctx.shadowColor=\"#ff4fd8\";ctx.fillStyle=`hsl(${305-e.stage*18} 65% 22%)`;ctx.beginPath();ctx.moveTo(0,-72);ctx.lineTo(96,-18);ctx.lineTo(65,60);ctx.lineTo(0,36);ctx.lineTo(-65,60);ctx.lineTo(-96,-18);ctx.closePath();ctx.fill();ctx.strokeStyle=\"#ff76df\";ctx.lineWidth=5;ctx.stroke();ctx.fillStyle=\"#fff\";ctx.beginPath();ctx.arc(0,-4,25,0,Math.PI*2);ctx.fill();ctx.fillStyle=\"#ff4fd8\";ctx.beginPath();ctx.arc(0,-4,11,0,Math.PI*2);ctx.fill()}\n else{const c=e.type===\"tank\"?\"#ff9a3d\":e.type===\"zig\"?\"#a873ff\":\"#55efff\";ctx.shadowBlur=16;ctx.shadowColor=c;ctx.fillStyle=c;if(e.type===\"tank\"){ctx.beginPath();ctx.roundRect(-29,-24,58,48,12);ctx.fill();ctx.fillStyle=\"#fff\";ctx.fillRect(-8,-31,16,24)}else{ctx.rotate(Math.PI);ctx.beginPath();ctx.moveTo(0,-24);ctx.lineTo(22,18);ctx.lineTo(0,8);ctx.lineTo(-22,18);ctx.closePath();ctx.fill();ctx.fillStyle=\"#fff\";ctx.beginPath();ctx.arc(0,2,6,0,Math.PI*2);ctx.fill()}}\n ctx.restore();\n}\nfunction draw(){\n const bg=stageData&#91;Math.max(0,stage-1)].bg,g=ctx.createLinearGradient(0,0,0,H);g.addColorStop(0,bg&#91;0]);g.addColorStop(1,bg&#91;1]);ctx.fillStyle=g;ctx.fillRect(0,0,W,H);\n ctx.save();if(shake>0)ctx.translate((Math.random()-.5)*shake,(Math.random()-.5)*shake);\n stars.forEach(s=>{ctx.globalAlpha=s.a;ctx.fillStyle=\"#fff\";ctx.fillRect(s.x,s.y,s.z,s.z*3)});ctx.globalAlpha=1;\n for(const b of bullets){ctx.shadowBlur=15;ctx.shadowColor=\"#55efff\";ctx.fillStyle=\"#efffff\";ctx.fillRect(b.x-3,b.y-13,6,24)}ctx.shadowBlur=0;\n for(const b of enemyBullets){ctx.shadowBlur=14;ctx.shadowColor=b.color||\"#ff4fd8\";ctx.fillStyle=b.color||\"#ff8ae7\";ctx.beginPath();ctx.arc(b.x,b.y,b.r,0,Math.PI*2);ctx.fill()}ctx.shadowBlur=0;\n enemies.forEach(drawEnemy);\n powerups.forEach(p=>{ctx.save();ctx.translate(p.x,p.y);ctx.rotate(p.spin);ctx.shadowBlur=18;ctx.shadowColor=\"#ffe66d\";ctx.fillStyle=\"#ffe66d\";ctx.beginPath();for(let i=0;i&lt;8;i++){const a=i*Math.PI\/4,r=i%2?7:15;ctx.lineTo(Math.cos(a)*r,Math.sin(a)*r)}ctx.closePath();ctx.fill();ctx.restore()});\n particles.forEach(p=>{ctx.globalAlpha=Math.max(0,p.life\/p.max);ctx.fillStyle=p.color;ctx.fillRect(p.x,p.y,p.size,p.size)});ctx.globalAlpha=1;\n if(!dead)drawShip();\n if(paused){ctx.fillStyle=\"#0009\";ctx.fillRect(0,0,W,H);ctx.fillStyle=\"#fff\";ctx.textAlign=\"center\";ctx.font=\"bold 54px system-ui\";ctx.fillText(\"PAUSE\",W\/2,H\/2)}\n if(flash>0){ctx.globalAlpha=flash;ctx.fillStyle=\"#fff\";ctx.fillRect(0,0,W,H);ctx.globalAlpha=1}\n ctx.restore();\n}\nfunction loop(now){if(!running)return;const dt=Math.min(.033,(now-last)\/1000);last=now;if(!paused)update(dt);draw();if(running)requestAnimationFrame(loop)}\nfunction setPointer(e){const r=canvas.getBoundingClientRect();player.x=(e.clientX-r.left)\/r.width*W;player.y=(e.clientY-r.top)\/r.height*H}\naddEventListener(\"keydown\",e=>{keys&#91;e.key]=true;keys&#91;e.key.toLowerCase()]=true;if(e.key.toLowerCase()===\"p\"&amp;&amp;running)paused=!paused;if(&#91;\"ArrowUp\",\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\" \"].includes(e.key))e.preventDefault()});\naddEventListener(\"keyup\",e=>{keys&#91;e.key]=false;keys&#91;e.key.toLowerCase()]=false});\ncanvas.addEventListener(\"pointerdown\",e=>{pointer=true;setPointer(e)});canvas.addEventListener(\"pointermove\",e=>{if(pointer)setPointer(e)});addEventListener(\"pointerup\",()=>pointer=false);\ndocument.querySelectorAll(\".touch\").forEach(b=>{const k=b.dataset.key;b.addEventListener(\"pointerdown\",e=>{e.preventDefault();keys&#91;k]=true});b.addEventListener(\"pointerup\",()=>keys&#91;k]=false);b.addEventListener(\"pointercancel\",()=>keys&#91;k]=false)});\ndocument.getElementById(\"startBtn\").addEventListener(\"click\",begin);\nhighEl.textContent=String(high).padStart(7,\"0\");updateHUD();draw();\n})();\n&lt;\/script>\n&lt;\/body>\n&lt;\/html><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[80,44],"tags":[3],"class_list":["post-26317","post","type-post","status-publish","format-standard","hentry","category-html","category-44","tag-programming"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=26317"}],"version-history":[{"count":1,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26317\/revisions"}],"predecessor-version":[{"id":26318,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26317\/revisions\/26318"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=26317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=26317"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=26317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}