# 必要なクラス(Terrain class)を作っていく

## 🛠 ステップ⑤：`<span class="editor-theme-code">Terrain</span>`<span style="color: rgb(224, 62, 45); white-space: pre-wrap;"> </span>クラスを作ろう！

ゲームに出てくる「地面」や「山」をつくるために、`<span class="editor-theme-code">Terrain</span>`<span style="white-space: pre-wrap;">（テレイン）という </span>****地形クラス****<span style="white-space: pre-wrap;"> を作ります。</span>

これは「****地形を作ったり、描いたり、調べたりする便利な道具****」だと思ってください。

---

### 🧱 1. 必要な情報（メンバ変数）

地形を作るには、「点」や「三角形」、サイズなどの情報が必要です。

```cpp
class Terrain {
public:
    Terrain() = default; // 何も設定しない初期状態のコンストラクタ

    void MakeTerrain(); // ← ランダムに地形を作る関数
    void Update();      // 地形の更新（今は何もしない）
    void Draw(Transform& t); // 地形を画面に描く関数

    void SetParams(const TerrainParams& params) { params_ = params; }

private:
    std::vector<Vertex> vertices_; // 点のリスト
    std::vector<uint32_t> indices_; // 三角形のリスト

    ID3D11Buffer* vertexBuffer_ = nullptr; // GPU用の頂点バッファ
    ID3D11Buffer* indexBuffer_ = nullptr;  // GPU用のインデックスバッファ
    ID3D11Buffer* globalCB = nullptr;      // 定数バッファ（カメラなどの情報）

    TerrainParams params_; // 地形のサイズ・スケール情報など

    void CreateBuffers();    // GPUにデータを送る関数
    void ComputeNormals();   // 法線（光の方向）を計算する関数
};
```

---

### <span style="white-space: pre-wrap;">🔧 2. 地形の設定データ </span>`<span class="editor-theme-code">TerrainParams</span>`

`<span class="editor-theme-code">params_</span>`<span style="white-space: pre-wrap;"> に入れるデータはこういう構造になっています：</span>

```cpp
struct TerrainParams {
    int width = 128;         // 横マス数（点の数）
    int height = 128;        // 縦マス数
    float scale = 1.0f;      // 1マスの大きさ（メートル）
    float heightScale = 10.0f; // 高さの最大値
};
```

---

### <span style="white-space: pre-wrap;">📌 3. </span>`<span class="editor-theme-code">Vertex</span>`<span style="white-space: pre-wrap;"> とは？</span>

<span style="white-space: pre-wrap;">点（頂点）は </span>`<span class="editor-theme-code">Vertex</span>`<span style="white-space: pre-wrap;"> という名前で、こう定義されています：</span>

```cpp
struct Vertex {
    DirectX::XMFLOAT3 position; // 座標（どこにあるか）
    DirectX::XMFLOAT3 normal;   // 法線（光の方向）
    DirectX::XMFLOAT2 uv;       // UV（テクスチャの貼る場所）
};
```

---

### 💡 補足：DirectXに必要なもの

地形を表示するには、DirectXの以下の機能を使います：

- 頂点バッファ（点の情報）
- インデックスバッファ（三角形のつなぎ方）
- テクスチャ（見た目の模様）
- 定数バッファ（カメラやライトの情報）

---

## ✅ ここまでのまとめ

<table id="bkmrk-%E5%90%8D%E5%89%8D%E5%BD%B9%E5%89%B2terrain%E5%9C%B0%E5%BD%A2%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%BB%E8%A1%A8%E7%A4%BA%E3%81%99"><colgroup><col></col><col></col></colgroup><tbody><tr><th>名前

</th><th>役割

</th></tr><tr><td>`<span class="editor-theme-code">Terrain</span>`

</td><td>地形を作る・表示するクラス

</td></tr><tr><td>`<span class="editor-theme-code">Vertex</span>`

</td><td>1つの点の情報（位置など）

</td></tr><tr><td>`<span class="editor-theme-code">TerrainParams</span>`

</td><td>地形全体のサイズやスケール

</td></tr><tr><td>`<span class="editor-theme-code">vertices_</span>`

</td><td>点の集まり

</td></tr><tr><td>`<span class="editor-theme-code">indices_</span>`

</td><td>三角形のつなぎ方

</td></tr><tr><td>`<span class="editor-theme-code">Draw()</span>`

</td><td>地形を画面に表示する関数

</td></tr></tbody></table>