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

1 / 4 CSVの数値とStageCellの対応 ​

このステップの目的

CSVの数値が何を表すかを読み取り、配置を変えたときの表示を予想します。配布済みの StageCell と入力検査の役割を確認します。

CSVに記録する配置 ​

Assets/Maps/Stage01.csv をテキストエディタで開きます。カンマで区切られた数値が横一列のマスに対応し、改行すると次の段へ進みます。すべての行のマス数をそろえます。

3列×2行の例(読み取り用)text
2,0,1
10,10,11

この例は、上段にプレイヤー開始位置・空白・ゴール、下段にレンガ・レンガ・苔石を並べています。まだ重力や地形衝突は扱わないため、この回では配置と表示を確かめます。

数値に名前を付けるStageCell ​

プログラムで cell == 10 と書くと、10が何を表すかを覚えておく必要があります。配布済みの Source/Platformer/Stage.h では、列挙型 StageCell で数値に名前を付けています。次は既存コードの抜粋です。

Stage.h(確認する箇所)cpp
enum class StageCell : int
{
    Empty = 0,
    Goal = 1,
    PlayerSpawn = 2,
    Brick = 10,
    Moss = 11,
};

コードでは StageCell::Brick と書くことで、レンガを扱うと分かります。CSVには引き続き数値の 10 を記録します。

番号はCSVとコードの約束なので、既存の値を変えません。値を明示せず自動採番に任せると、途中への項目追加で後続の番号が変わることがあります。ここでは値を明示し、10番台を地形に使っています。敵やトラップの値は、それを扱う回で追加します。

名前と入力検査の役割 ​

enum class に名前を定義するだけでは、CSVの不正な値を拒否できません。static_cast<StageCell>(37) は、37が定義されていなくても変換できます。

そこで、配布済みの Stage.cpp の TryParseStageCell が、空白・ゴール・開始位置、または地形の定義表に登録された値かを調べます。今回受け付ける値は 0、1、2、10、11 です。

ただし、レンガを置くつもりで有効な値の 1 を入力した場合、入力検査では意図の違いを判断できません。数値として使えるかはプログラムで調べ、配置が意図どおりかは表示して確かめます。

配置の読み取り ​

先ほどの2行の例で、最後の 11 を 10 へ変えると、どのマスの何が変わるでしょうか。さらに 37 へ変えた場合との違いを説明してください。実際の表示とエラーの確認は、描画を接続した後に行います。

チェックリスト
  • CSVの行・列と画面上のマスの対応を説明できる
  • StageCell::Brick とCSVの 10 が同じ種類を表すと分かる
  • 未定義値の検査と、意図した配置の確認を区別できる

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