Appearance
第15回 CSVから作るステージ
第15回では、プレイヤーが冒険する舞台となる「ステージ」を構築します。
ステージの地形配置をC++コード内に直接記述するのではなく、外部のCSVファイルから読み込むデータ駆動の仕組みを導入します。カンマ区切りの数値を列挙型 StageCell へ変換し、ブロックやゴールを画面上に正しく配置するとともに、誤ったCSVデータを検知するエラーハンドリングを学びます。
配布プロジェクト
第15回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
プレイヤーの基本機能に加え、初期ステージデータ Assets/Maps/Stage01.csv と、ステージ管理クラス Stage の基本構造が用意されています。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
Source/Platformer/Tuning/GameTuning.h | 1タイルの大きさ(TileSize)やゴールの調整値 |
Assets/Maps/Stage01.csv | レンガ、苔石、ゴール、開始位置が定義されたステージデータ |
この回のゴール
Stage01.csv の内容に応じてレンガ、苔石、ゴール地点、プレイヤー開始位置を画面上に整然と描画します。
また、CSV内に存在しない不正な数値や列数のズレがあった場合、エラーの発生した行・列・原因を表示して安全に停止できることを確認します。
- CSVの生数値を
enum class StageCellへ型安全に変換できる - 2次元の動的配列
std::vector<std::vector<StageCell>>へマップデータを読み込める - 配置情報(プレイヤー開始位置・ゴール)と地形ブロックの役割を正しく分離できる
- 定義表(
TileDefinition)を用いて、条件分岐を乱立させずに複数の地形を描き分けられる - 不正なCSVデータに対して、行番号・列番号付きのエラーメッセージを生成できる
今回のポイント
データ駆動(Data-Driven)によるステージ制作
マップデータを外部のCSVファイルに切り離すことで、C++のコードを変更・リビルドすることなく、テキストエディタや表計算ソフトでステージを編集できるようになります。
CSVマップファイル
std::getlineで行列を解析しTryParseStageCell()で検証
セル値変換
セル値変換
Stageクラスの2次元グリッド配列としてメモリに格納
地形配列保持
地形配列保持
TileDefinitionを参照して対応するテクスチャを画面表示
ステージ描画
また、CSV上の整数値は将来の拡張を見据えて用途ごとに値域を整理しています。
| 値域 | 用途 | この回で使う値 |
|---|---|---|
0 | 空白 | Empty |
1〜9 | 進行・ギミック | Goal、PlayerSpawn |
10〜19 | 通常地形 | Brick、Moss |
20〜29 | トラップ | 後の回(第23回)で追加 |
90〜99 | 敵配置 | 後の回(第21回)で追加 |
作業の準備
開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | Source/Platformer/Stage.cpp、Source/Platformer/Stage.h |
| 既存ファイルへ追記・編集 | Source/Platformer/Game.cpp、Source/Platformer/Game.h、Source/Platformer/Player.cpp、Source/Platformer/Tuning/GameTuning.h |
| 重点的に実装・確認する処理 | Game::Initialize、Stage::Draw |
ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。
GameTuning.h には今回必要な定数を追記し、自身で調整した既存の値を維持します。素材やステージCSVはプロジェクト直下の Assets/ フォルダを編集します。
授業の進め方
1 / 4CSVの値をStageCellへ変換するCSVファイル内に記述された整数値をスコープ付き列挙型
StageCell へ変換し、定義済みの値のみを安全に受け付ける設計を学びます。2 / 4CSVを行と列に分解するstd::filesystem::path を用いて安全にCSVファイルを開き、各行のカンマ区切りテキストを2次元のセル配列へと展開する処理を実装します。3 / 4セルの役割を描画と配置へ分けるプレイヤー開始位置やゴールなどの「配置用目印」を地形データから分離し、定義表(TileDefinition)を用いて描画する仕組みを実装します。4 / 4CSVの問題を行と列で報告するCSVファイル内の記述ミス(数値以外、未定義値、列数不一致、必須セルの過不足)を行番号・列番号付きで通知し、修正箇所を特定できるエラーハンドリングを実装します。動作確認
- CSVの行と列の並び通りにステージブロックが描画される
- プレイヤー開始位置とゴールが各1つだけ正しく検出される
- 未定義値、文字、空セル、列数不一致をエラーとして検出できる
- CSVの列数と行数からステージ全体の幅と高さを算出できる