2 / 4 CSVの読み込みと開始位置の接続
配布済みのCSVローダーが保存する情報を確認し、CSVに記録した位置からプレイヤーを開始させます。
実装済みの読み込み処理
Stage.h と Stage.cpp は配布プロジェクトへ登録済みです。CSVを行と列に分ける処理や入力検査を追加する必要はありません。Game::Initialize から stage_.Initialize(StagePath) を呼ぶ処理と、失敗理由を表示して初期化を中断する処理も用意されています。
読み込みは次の順序です。
Assets/Maps/Stage01.csvを開く。- 1行ずつ読み、カンマでマスに分けて数値と列数を検査する。
- 開始位置とゴールの座標を記録し、地形の種類を配列へ保存する。
- 開始位置とゴールがそれぞれ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 は、この座標をプレイヤーへ渡す実装済みの関数です。
void Game::ResetStage()
{
player_.Reset(stage_.GetPlayerSpawn());
}Game::Initialize の末尾にある次の固定位置の行を、ResetStage(); に置き換えます。直後の return true; と、その前にある画像・CSVの読み込み処理は残します。
player_.Reset({ 320.0f, 240.0f }); // CSVの開始位置へ接続するResetStage();ビルドして実行します。地形はまだ表示されませんが、プレイヤーの開始位置がCSVの 2 のマスの中心に変わります。F1の座標表示と、CSV上の行・列から計算した座標を比べてください。
-
cells_[y][x]の行と列の順序を説明できる - 固定の座標ではなく、CSVから取得した位置でプレイヤーを開始できる
- 1マス右へ開始位置を変えたとき、x座標がいくつ増えるか予想できる