Skip to content

Latest commit

 

History

History
115 lines (92 loc) · 5.91 KB

File metadata and controls

115 lines (92 loc) · 5.91 KB

作業台帳: インベーダーゲーム

完了の定義

ブラウザで index.html を開くだけで起動し、自機の左右移動と射撃、敵隊列の 左右往復と下降、敵の射撃、防壁の侵食、UFO の出現、スコア・ライフ・レベル・ ハイスコア、ポーズ、ゲームオーバーとクリアがすべて動作する Space Invaders が ~/omp/invaders/index.html 単体で完成している。ヘッドレスブラウザで起動検証し、 pageerror なし、Canvas に描画があること、キー入力で自機が動くことを確認する。 README に操作方法と起動手順を記載する。

設計判断(advisory 反映済み)

  • 単一自己完結 HTML(インライン CSS/JS、外部依存ゼロ)。file:// でダブルクリック 即プレイ可能。ES modules は使わない(file:// で CORS 失敗するため)。
  • コードは IIFE + 名前空間オブジェクトで構造化。実装ファイル数と workflowz の 並列性は独立で、設計レビュー・動作検証・コードレビューを並列エージェントで担保する。
  • 検証には実在する browser ツール(組み込みヘッドレス Chromium)と zai-mcp-server の画像分析を使う。canvas-game-verify は不存在のため使わない。

参照スキル(実在確認済み)

  • game-development(親: 固定タイムステップ、入力抽象、衝突戦略)
  • game-development/web-games(Raw Canvas 選定、Audio はユーザー操作後に resume、 タブ非表示でポーズ、プール音源)
  • game-development/2d-games(8-24FPS スプライトアニメ、Box 衝突、 固定タイムステップ、画面シェイク 50-200ms)
  • game-development/game-design(コアループ、難易度バランス)
  • game-development/game-art(ピクセルアート 1x 作業・スケールアップ)
  • game-development/game-audio(カテゴリ別ミックス、ユーザージェスチャー要件)
  • clear-japanese(コメント・UI 文言・README)

仕様

画面・座標

  • Canvas 800x600、左上原点、y 下向き正。背景黒。
  • 自機ライン y=560(GROUND_Y)。敵隊列は上段から配置。

入力

  • 左右: ArrowLeft/Right または A/D
  • 射撃: Space(エッジ検出、押しっぱなし不可)
  • ポーズ: P / Esc
  • ミュート: M
  • 開始・リスタート: Enter

自機

  • 左右移動 speed=320 px/s、画面端で停止。
  • 射撃クールダウン 0.35s。自機弾は同時に最大1発。
  • ライフ3。被弾で1.2s 無敵+点滅リスポーン。ライフ0でゲームオーバー。

  • 5行x11列。上段(0行)30pt、1-2行20pt、3-4行10pt。
  • 左右往復、端で反転+1段下降。歩進間隔は残敵数で短縮 (55体時0.65s → 1体時0.08s)。
  • 歩進ごとに2フレームアニメ切替+歩進音(音高4段階)。
  • 生存敵の最下段からランダム射撃。敵弾同時最大3発。
  • いずれかの敵が GROUND_Y に達したらゲームオーバー。

UFO

  • 18-35s 間隔でランダム出現。画面端から横切る。
  • 得点は [50,100,150,300] からランダム。持続音あり。

防壁

  • 4個、y=440。ブロック格子(blockSize=4)。
  • 弾が命中したブロックと周囲1ブロックを侵食(削除)。

弾・衝突

  • AABB 矩形衝突。自機弾は敵/UFO/防壁。敵弾は自機/防壁。
  • 衝突で弾消滅。敵命中でスコア加算+爆発エフェクト+音。

進行・状態

  • 状態: MENU / PLAYING / PAUSED / GAMEOVER / WIN。
  • 全敵撃破でレベル+1、敵再配置・歩進間隔短縮・敵弾最大+1(上限5)。
  • ハイスコアは localStorage に保存。
  • タブ非表示で自動ポーズ。

描画

  • ドット絵はビットマップ配列(0/1)を定義し、ctx.fillRect で拡大描画。
  • 敵・自機・UFO はスプライト関数。爆発は放射状パーティクル。
  • HUD: スコア・ハイスコア・ライフ(アイコン)・レベル。
  • オーバーレイ: メニュー/ポーズ/ゲームオーバー/クリアのメッセージ。

音(Web Audio API 合成、外部音源なし)

  • AudioContext は最初のユーザー操作後に作成・resume。
  • 射撃(矩形波短)、敵射撃(ノイズ短)、爆発(ノイズ減衰)、 歩進(4段階の矩形波)、UFO持続音(揺れる矩形波)、被弾(下降 sweep)、 勝利(上昇アルペジオ)、敗北(下降ノイズ)。
  • ミュート切替可。

検証方法

  1. python3 -m http.server 8099 --directory ~/omp/invaders で提供。
  2. browser ツールで http://localhost:8099/ を開く。
  3. pageerror / console.error がないことを確認。
  4. Canvas のピクセルを取得し、完全黒でない(描画されている)ことを確認。
  5. スクリーンショットで inspect_image/zai で描画内容を確認。
  6. 合成 KeyboardEvent で自機移動・発火を確認。
  7. README に操作方法と起動手順を記載。

ワークフロー(workflowz)

  • フェーズ1(私): 仕様定義・LEDGER 作成。
  • フェーズ2(私): index.html 単体実装。
  • フェーズ3(並列サブエージェント): 動作検証(browser) / コードレビュー(バグ) / UX・仕様レビュー を同時ファンアウト。各エージェントは証拠を返す。
  • フェーズ4(私): 返却された指摘を検証し修正。
  • フェーズ5(私): README 作成・最終ヘッドレス検証・完了宣言。

判断ログ

  • 単一HTML採用: file:// 即プレイ・検証単純化・配布容易。実装は1コンテキストで 持てる規模なので分割統合のリスクを避ける。
  • フレームワーク不採用: インベーダー規模では Raw Canvas が依存最少。
  • 外部アセット不使用: ドット絵はビットマップ配列内製、音は Web Audio 合成。 1ファイルで完結しオフラインで動く。