Skip to content
第24回 地形の種類追加と作品の完成

1 / 4 地形の種類を追加する

このステップの目的

独自に用意した地形画像を識別子・セル列挙型・タイル定義表・CSVファイルへと一貫して登録し、既存の描画や物理判定コードを変更することなく新ブロックを追加する手順を実践します。

データ駆動設計による拡張性

本教材のステージシステムは、プログラムコード内に「レンガ専用の処理」や「苔石専用の処理」といった個別分岐を持たないデータ駆動設計を採用しています。

そのため、新しい地形ブロックやトラップを追加する際、描画関数や物理衝突アルゴリズム(ResolveHorizontal など)のロジック本体に手を加える必要はありません。定義テーブルへデータを追加するだけで、既存の判定を再利用して新要素を組み込むことができます。

新しい地形(石ブロック Stone)の追加手順

ここでは、新しい通常地形ブロック「石(Stone)」を追加する具体的な4つのステップを解説します。

ステップ1: 画像ファイルの配置とリソース登録

  1. 画像ファイル(例: TileStone.png)を Assets/Images/ ディレクトリへ配置します。
  2. ImageManager.hImageId 列挙型に TileStone を追加します。
  3. ImageManager.cppimageDefinitions 配列へ次の行を追加します。
ImageManager.cpp(imageDefinitionsへ追加)cpp
{ ImageId::TileStone, L"Assets/Images/TileStone.png" },
cpp
// ImageManager.h
enum class ImageId
{
    // ...
    Tile,
    TileMoss,
    TileStone, // 追加
    // ...
    Count
};

ステップ2: セル列挙型への登録

CSVファイル上で使用する数値IDを決め、Stage.hStageCell 列挙型に対応する名前を定義します。ここでは通常地形の空き番号である 12 を割り当てます。

cpp
enum class StageCell : int
{
    Empty = 0,
    Goal = 1,
    PlayerSpawn = 2,
    Brick = 10,
    Moss = 11,
    Stone = 12, // 追加
    Spike = 20,
    EnemySpawn = 90
};

ステップ3: タイル属性テーブルへの定義追加

Stage.cpptileDefinitions 配列に、StageCell::Stone の行を追加します。石ブロックは足場となる通常地形であるため、isSolid = trueisHazard = false を指定します。

cpp
{ StageCell::Stone, ImageId::TileStone, true, false,
  { 0.0f, 0.0f, TileWorldSize, TileWorldSize }, {} },

ステップ4: CSVマップファイルへの配置

テキストエディタで Assets/Maps/Stage01.csv を開き、配置したいマスの数値を 12 に変更します。

TileDefinitionの要素は、cell、imageId、isSolid、isHazard、drawRect、hazardRectの順です。石は固い地形で、危険判定は持たないため最後は空の矩形にします。

動作確認と検証

ゲームを起動し、新しく配置した石ブロックが正しく描画されていることを確認します。さらに、F1キーを押してデバッグ表示を有効化し、以下の点を確認します:

  • 新しいブロックの周囲に青色の進入不可枠(Solid判定)が表示されているか
  • プレイヤーが問題なく石ブロックの上に着地して歩行できるか
  • 壁として接触した際に正しく横方向の押し戻しが働くか
チェックリスト
  • 画像登録、列挙型定義、タイル属性定義、CSV配置の4段階の追加フローを説明できる
  • 既存の描画処理や衝突判定関数に手を加えることなく新ブロックを追加できる
  • F1デバッグ表示を用いて、追加したブロックに意図通りの当たり判定が付与されていることを検証できる

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