Skip to content
第15回 CSVから作るステージ

2 / 4 CSVの読み込みと開始位置の接続 ​

このステップの目的

配布済みのCSVローダーが保存する情報を確認し、CSVに記録した位置からプレイヤーを開始させます。

実装済みの読み込み処理 ​

Stage.h と Stage.cpp は配布プロジェクトへ登録済みです。CSVを行と列に分ける処理や入力検査を追加する必要はありません。Game::Initialize から stage_.Initialize(StagePath) を呼ぶ処理と、失敗理由を表示して初期化を中断する処理も用意されています。

読み込みは次の順序です。

  1. Assets/Maps/Stage01.csv を開く。
  2. 1行ずつ読み、カンマでマスに分けて数値と列数を検査する。
  3. 開始位置とゴールの座標を記録し、地形の種類を配列へ保存する。
  4. 開始位置とゴールがそれぞれ1つあることを確認する。

Stage の cells_ は、行の配列の中に各行のマスを持つ std::vector<std::vector<StageCell>> です。cells_[y][x] で、上から y 行目、左から x 列目の地形を取得します。添字は0から数えます。読み込み後の mapWidth_ は列数、mapHeight_ は行数です。

ファイルのパス

Stage::Initialize は std::filesystem::path でパスを受け取ります。Windowsのこのプロジェクトでは L"Assets/Maps/Stage01.csv" のようなワイド文字列から渡し、日本語を含むフォルダ名にも対応します。

ローダーの詳しいコードを調べたい場合は、最終ステップの参考実装の Stage.cpp を参照してください。

CSVに記録した開始位置の利用 ​

開始位置の 2 は、そのマスの中心座標へ変換して保存されます。1マスが32ピクセルなら、左から0列目・上から0行目の中心は (16, 16)、1列目・0行目の中心は (48, 16) です。

Game.cpp の末尾にある ResetStage は、この座標をプレイヤーへ渡す実装済みの関数です。

Game.cpp(既存の処理)cpp
void Game::ResetStage()
{
    player_.Reset(stage_.GetPlayerSpawn());
}

Game::Initialize の末尾にある次の固定位置の行を、ResetStage(); に置き換えます。直後の return true; と、その前にある画像・CSVの読み込み処理は残します。

置き換える行cpp
player_.Reset({ 320.0f, 240.0f }); // CSVの開始位置へ接続する
置き換え後cpp
ResetStage();

ビルドして実行します。地形はまだ表示されませんが、プレイヤーの開始位置がCSVの 2 のマスの中心に変わります。F1の座標表示と、CSV上の行・列から計算した座標を比べてください。

チェックリスト
  • cells_[y][x] の行と列の順序を説明できる
  • 固定の座標ではなく、CSVから取得した位置でプレイヤーを開始できる
  • 1マス右へ開始位置を変えたとき、x座標がいくつ増えるか予想できる

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