AniVaderBreaker Lab
← Back to Journey

AnivaderBreaker 誕生記
テニス × ブロック崩し × インベーダー、三位一体の宇宙大作戦

PROLOGUE

造語「AnivaderBreaker」が生まれるまで

最初のゲーム InvaderBreaker を作った翌日、Edenyはすぐに次の問いを立てた。「もっと複雑な、ちゃんと遊べるゲームを作れるか?」

発想の核は三位一体だった。ボールでインベーダーを倒すブロック崩し部分、下から弾が飛んでくるインベーダー部分、そしてパドルで弾き返すテニス部分——三つのゲームジャンルを一つのフィールドに同居させる。

さらに問題があった。元のスペースインベーダーのグラフィックをそのまま使うと著作権がグレーゾーンになる。だからインベーダーをオリジナルの動物宇宙人にリデザインすることにした——ネコ族、ウサギ族、クマ族の三種族。これが「Animal + Invader + Breaker」、造語AnivaderBreakerの由来だ。

BUILD

ピクセルと音の設計

3値スプライトという設計

12×10ピクセルの動物スプライトは、各ピクセルを 0=透明 / 1=本体色 / 2=サブ色 / 3=ダーク の4値で定義した。描画時に色テーブルを参照する方式なので、1つのデータで何色の種族にも化けられる。行ごとに色を変えるインベーダー編隊の表現もこの設計があってこそ成立した。

// ピクセル値: 0=透明, 1=本体色, 2=サブ色, 3=ダーク // 1データで任意の色に変換できる汎用設計 function drawSprite(spr, frame, x, y, mainColor, subColor, darkColor) { spr[frame].forEach((row, ry) => { row.forEach((v, cx) => { if (!v) return; ctx.fillStyle = v===1 ? mainColor : v===2 ? subColor : darkColor; ctx.fillRect(x + cx*PIX, y + ry*PIX, PIX, PIX); }); }); }

ボスが「崩れていく」演出

HP20のバッファロー型ボスは、ダメージを受けるたびに色が変わる(黄金→オレンジ→赤)だけでなく、ピクセルそのものがランダムに欠けていく。壊れたピクセルのインデックスを Set で管理し、描画時にスキップするだけの実装だが、視覚的なインパクトは大きい。

ダメージ段階が上がるほど弾数も減る(3発→2発→1発)という逆説的なバランス——ボスが崩れるほど弱くなっていくデザインだ。

Web Audio だけで7種の効果音

音は全てライブラリゼロ、Web Audio API 一本で合成した。インベーダー撃破はホワイトノイズをバンドパスフィルタに通した「ドスッ」という音、UFOのハム音は低周波オシレーター(LFO)でメインの音程をゆらす方式。合成手法を音の種類ごとに変えることで、単調にならない音世界を作った。

// UFOハム: LFO(8Hz)でサイン波の音程をうねらせてビビリ音に // lfo → lfoGain → oscillator.frequency と繋ぐだけで実現 lfo.frequency.value = 8; lfoGain.gain.value = 80; // ±80Hz で音程が揺れる lfo.connect(lfoGain); lfoGain.connect(oscillator.frequency);
INSIGHT

作って気づいたテクニック

TIP 01 ボスはフェーズ FSM で管理する
warning → entering → active → dying の4状態。boss.phase を見て処理を分岐するだけで、入場演出・通常行動・死亡演出が整然と管理できる。フェーズ外の処理が混入しないのが強み。
TIP 02 画面シェイクは「減衰カウンタ」方式
screenShake *= 0.82 で毎フレーム減衰させる。ctx.translate にランダムオフセットを加えるだけで揺れる。Math.max(現在値, 新規値) を使えば重複してもオーバーシュートしない。
TIP 03 タイトル画面を演出のデモ場にする
ゲームで使う全演出(スプライト・パーティクル・ボス・UFO)をタイトル画面で流す設計にした。動作確認を兼ねつつ、プレイ前にゲームの熱量をプレイヤーに届けられる一石二鳥の仕掛けだ。
TIP 04 光るインベーダーは Set でインデックス管理
「3体倒すと残機+1」のシャイニングインベーダーは、row*COLS+col の論理インデックスを Set で管理する。配列インデックスを使わないことで、前の行が消えてもズレが起きない。
著作権リスクをゼロにするためにインベーダーを動物にした。その制約が結果として、ゲームに唯一無二のキャラクターを生んだ。

SUMMARY

「テニス×ブロック崩し×インベーダー」という独自ジャンルの AnivaderBreaker を1日で完成させた。インベーダーをオリジナルの動物宇宙人にリデザインして著作権問題を回避しつつ、3値ピクセルアートの汎用スプライト設計、4フェーズのボスFSM、ピクセルが欠けていくダメージ演出、LFOによるUFOハム音——中上級ブラウザゲームと呼べるクオリティを1ファイルHTML5で実現した記録。造語「AnivaderBreaker」、なんか最高な気がしてきた。

ALL UEFN × Verse Lab Log