Skip to content

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

第15回では、プレイヤーが冒険する舞台となる「ステージ」を構築します。
ステージの地形配置をC++コード内に直接記述するのではなく、外部のCSVファイルから読み込むデータ駆動の仕組みを導入します。カンマ区切りの数値を列挙型 StageCell へ変換し、ブロックやゴールを画面上に正しく配置するとともに、誤ったCSVデータを検知するエラーハンドリングを学びます。

配布プロジェクト

第15回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
プレイヤーの基本機能に加え、初期ステージデータ Assets/Maps/Stage01.csv と、ステージ管理クラス Stage の基本構造が用意されています。

配布ファイル一覧
ファイル役割
Source/Platformer/Tuning/GameTuning.h1タイルの大きさ(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
19進行・ギミックGoalPlayerSpawn
1019通常地形BrickMoss
2029トラップ後の回(第23回)で追加
9099敵配置後の回(第21回)で追加

作業の準備

開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。

作業対象
新規作成Source/Platformer/Stage.cppSource/Platformer/Stage.h
既存ファイルへ追記・編集Source/Platformer/Game.cppSource/Platformer/Game.hSource/Platformer/Player.cppSource/Platformer/Tuning/GameTuning.h
重点的に実装・確認する処理Game::InitializeStage::Draw

ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。

GameTuning.h には今回必要な定数を追記し、自身で調整した既存の値を維持します。素材やステージCSVはプロジェクト直下の Assets/ フォルダを編集します。

授業の進め方

動作確認

  • CSVの行と列の並び通りにステージブロックが描画される
  • プレイヤー開始位置とゴールが各1つだけ正しく検出される
  • 未定義値、文字、空セル、列数不一致をエラーとして検出できる
  • CSVの列数と行数からステージ全体の幅と高さを算出できる

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