# 第24回開始用プロジェクト

第23回の標準到達状態です。第24回では、独自の地形またはトラップを追加し、Release成果物を作ります。

CSV値は`StageCell`で名前を付け、地形画像は定義表を介して複数種類を扱います。そのため、ゲーム進行やプレイヤー・敵の衝突処理はCSV上の整数や画像種類に依存しません。

プレイヤーは`StageCell::PlayerSpawn`の位置から開始します。リトライ時も同じ位置を`Stage`へ問い合わせるため、開始座標をゲーム進行側へ重複して持ちません。

## 第23回で追加した機能

- `enum class GameState`による4状態の管理
- `Game::ChangeState()`への状態変更、副作用、BGM切り替えの集約
- `StageCell::Spike`（CSV値`20`）の棘トラップと、元画像から独立した`drawRect`・`hazardRect`
- `Stage::IsHazardAtRect()`によるトラップ接触の問い合わせ
- トラップ接触を最初のゲームオーバー条件として実装
- 上から踏んだ場合の敵撃破とプレイヤーの跳ね返り
- タイトル画面からのゲーム開始
- ゴールの表示矩形とは独立した`goal::Trigger`によるクリア判定
- 敵への横接触またはステージ外落下によるゲームオーバー
- 結果画面からのリトライとタイトル復帰
- タイトルBGM、プレイBGM、ゴールSE、ゲームオーバーSEの連携
- `ResetStage()`によるPlayer、EnemyManager、Cameraの一括初期化

## 状態遷移

```text
Title -- Z --> Playing
Playing -- Goal --> GameClear
Playing -- Trap/Enemy/Fall --> GameOver
GameClear/GameOver -- Z --> Playing
GameClear/GameOver -- T --> Title
```

入力や衝突側から複数のメンバーを書き換えず、必ず`ChangeState()`を通して状態と音声を同時に切り替えます。リトライ時は`ResetStage()`を1回呼ぶだけで、プレイヤー、敵、カメラを同じ開始状態へ戻します。

実装は「プレイヤーとトラップの単純な矩形判定」から始め、その後で敵の上半分、プレイヤーの落下方向を使う踏みつけ判定へ進みます。棘の元画像は1254×1254ピクセル、表示先の`drawRect`は32×40ピクセル、即死判定の`hazardRect`は棘の内側24×24ピクセルです。F1では地形を青、トラップ判定を紫で確認できます。

## 操作

| 状態 | キー | 操作 |
| --- | --- | --- |
| タイトル | Z | ゲーム開始 |
| プレイ中 | 左右矢印 | 移動 |
| プレイ中 | Z | ジャンプ |
| 結果画面 | Z | リトライ |
| 結果画面 | T | タイトルへ戻る |
| 常時 | F1 | デバッグ表示の切り替え |
| 常時 | Esc | 終了 |

## 次回への引き継ぎ

第24回では、表示矩形と判定矩形を同時に比較し、新しい通常地形またはトラップを定義表へ追加してから、Release成果物と制作環境外での起動確認を仕上げます。

Debug・Releaseのビルド後には、プロジェクト直下の`Assets`が出力先へ自動コピーされます。編集する素材はプロジェクト直下の`Assets`だけにしてください。
