Skip to content
第21回 敵の配置とジャンプ操作の改善

1 / 4 ステージCSVからの敵出現位置の読み込み

このステップの目的

ステージCSV内の敵配置セル(90 / StageCell::EnemySpawn)をワールド座標へと変換して出現位置リストに記録し、地形データ配列上では空白セルとして保持する仕組みを実装します。

列挙型による敵出現セルの判定

ステージCSVデータ内では、敵の初期出現位置を数値の 90 として記述しています。プログラム側では数値を直接比較するのではなく、列挙型 StageCell::EnemySpawn に対応付けて判定を行います。

Stage.cppcpp
else if (csvCell == StageCell::EnemySpawn)
{
    AddEnemySpawn(x, y);
}

数値の意味をコード上で列挙型として表現することで、マップ定義の変更や別の配置要素が追加された場合でも、可読性と保守性を保つことができます。

タイル座標からワールド座標への変換

敵キャラクターの初期配置は、CSVのマス目座標(タイル座標)から実空間のワールド座標へと変換して登録します。

Stage.cppcpp
void Stage::AddEnemySpawn(int tileX, int tileY)
{
    enemySpawns_.push_back({
        {
            tileX * static_cast<float>(TileSize) + TileSize * 0.5f,
            tileY * static_cast<float>(TileSize) + TileSize * 0.5f
        }
    });
}

AddEnemySpawn(x, y) ではタイルの中心座標を算出します。敵キャラクターの当たり判定の基準点に合わせて出現座標を決定することで、初期配置時のめり込みや浮き上がりを防止します。

出現位置のセルを地形配列で空白にする理由

出現位置を記録した後、そのタイルに対応する地形配列のデータは StageCell::Empty(空白)として保持します。

Stage.cppcpp
// 敵出現位置を記録した後は、地形としては空白として扱う
cells_[y][x] = StageCell::Empty;

動的エンティティと静的地形の分離

敵キャラクターは、ゲーム進行中に移動し、倒されれば消滅する動的なエンティティです。一方、地形配列(cells_)は壁や床といった静的な衝突境界を管理する領域です。

もし地形配列内に敵のセルを残してしまうと、以下の問題が生じます。

  • 敵が移動した後も、元の場所に当たり判定が残ってしまう
  • 地形の一括描画処理が敵の出現位置をブロックとして描画してしまう
  • 敵が倒されて消滅した後も、その位置に壁判定が残り続ける

CSVから出現位置の座標を抽出し、地形配列側は空白にしておくことで、ステージ形状と敵キャラクターのライフサイクルを独立して管理できます。

チェックリスト
  • CSVの整数値 90StageCell::EnemySpawn 列挙子として判定できる
  • タイルインデックスからタイルの中心ワールド座標を算出し、出現位置リストへ格納できる
  • 動的キャラクターと静的地形の判定を混同しないよう、出現位置セルを地形配列で空白として保持する理由を説明できる

ゲームプログラミング実践