# メモ

## 🎮 前提条件（仕様）

- <span style="white-space: pre-wrap;">プレイヤーは高さ </span>****2ブロック分****の大きさ（頭＋胴体）
- ****ジャンプは1ブロック分のみ****可能
- <span style="white-space: pre-wrap;">ブロック世界は </span>`<span class="editor-theme-code">world[x][y][z]</span>`<span style="white-space: pre-wrap;"> のようなグリッドで表現</span>
- 「今立っている場所」と「前進方向」にあるブロックを調べて移動可能性を判定

---

## 🔍 判定に使うブロック範囲（図）

<span style="white-space: pre-wrap;">プレイヤーの足元 </span>`<span class="editor-theme-code">py</span>`<span style="white-space: pre-wrap;"> として、</span>  
<span style="white-space: pre-wrap;">進行方向の </span>`<span class="editor-theme-code">dx, dz</span>`<span style="white-space: pre-wrap;"> を使って座標 </span>`<span class="editor-theme-code">(px+dx, py, pz+dz)</span>`<span style="white-space: pre-wrap;"> などを調べます。</span>

```
上から見た進行方向（Z奥に進む場合）
     ↑ 進行方向
     z
     |
     |
[x][y+2][z+1] ← ジャンプ時の頭上クリアチェック
[x][y+1][z+1] ← 頭位置
[x][y  ][z+1] ← 足元 or 障害物

[x][y+1][z]   ← 現在地（頭）
[x][y  ][z]   ← 現在地（足）
```

---

## ✅ 判定ロジックまとめ（擬似コード）

```cpp
bool CanMoveForward(int px, int py, int pz, int dx, int dz) {
    int tx = px + dx;
    int tz = pz + dz;

    // ケース①：目の前が空いていて、2ブロック分スペースがある
    if (isAir(tx, py, tz) && isAir(tx, py + 1, tz)) {
        return true; // そのまま前進
    }

    // ケース②：1段段差があるけど、ジャンプで登れる
    if (!isAir(tx, py, tz) && isAir(tx, py + 1, tz) && isAir(tx, py + 2, tz)) {
        return true; // ジャンプで前進可能
    }

    // その他：ぶつかる or 高すぎる
    return false;
}
```

---

## 🧱 判定図（側面図）

```
ケース①：そのまま進める

       空気
    [ ][y+1][ ]
    [ ][ y ][ ] ← 前方2ブロックが空なので通れる
    ↑↑↑
  頭 胴 足

ケース②：1段ジャンプ可能

    [ ][y+2][ ] ← 空気（ジャンプ後の頭）
    [x][y+1][ ] ← 空気（ジャンプ後の胴体）
    [x][ y ][ ] ← ブロック（ジャンプ対象）

ケース③：進めない（壁 or 高すぎ）

    [x][y+2][x]
    [x][y+1][x] ← どこかが詰まってるのでNG
    [x][ y ][x]
```

---

## 🛠 isAirとは？

```cpp
bool isAir(int x, int y, int z) {
    return world[x][y][z] == BLOCK_AIR;
}
```

## ✅ メリット

- 複雑な物理処理なしで、ブロック単位で「進める or ジャンプできる」を判定できる
- 敵AIやパスファインディングでも使いやすい
- 斜面や複雑地形にも柔軟に対応可能

# 🎮 状態のしくみ：プレイヤーの「行動モード」を理解しよう！

---

## 🎲 プレイヤーの3つの状態

1. ****歩いてる****（＝普通に移動）
2. ****ジャンプ中****（＝1段上へピョン！）
3. ****落下中****（＝足元が空で落ちてる）

---

## 🔁 状態の流れ（図っぽく）

```
↑
      ジャンプ ←────────
        ↑               │
        │               │
   落下中に終点到達   落下する条件
        ↑               │
        │               ↓
[歩いてる] ──→ [落下中] ──→ [落下中継続]
        ↑                     │
        └──── ジャンプできる？ ───┘
```

---

## 🧠 状態の切り替え条件（とってもやさしく！）

---

### 🚶‍♂️ 歩く状態（isWalking）

#### ● いつこの状態になる？

- キーボードで前に進むキーを押したとき
- <span style="white-space: pre-wrap;">進みたい先が </span>****空いてる（ブロックがない）****

#### ● 何をする？

- 少しずつ前に動く
- 動き終わったら止まる（また入力待ち）

---

### 🦘 ジャンプ状態（isJumping）

#### ● いつこの状態になる？

- 前にブロックがあるけど、
- ****その上に空間がある****（＝乗れる）

#### ● 何をする？

- 放物線のアニメで、****ピョンと1段上****に乗る
- 着地したら「歩く状態」に戻る

---

### 🕳️ 落下状態（isFalling）

#### ● いつこの状態になる？

- <span style="white-space: pre-wrap;">足元に </span>****ブロックがない（空中に浮いてる）****

#### ● 何をする？

- 少しずつ下に落ちる
- 下にブロックがあるところで止まる

---

## 🧩 状態フラグで管理（プログラム上）

<table id="bkmrk-%E3%83%95%E3%83%A9%E3%82%B0true-%E3%81%AE%E6%84%8F%E5%91%B3false-%E3%81%AE%E6%84%8F%E5%91%B3"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>フラグ

</th><th>true の意味

</th><th>false の意味

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

</td><td>歩いてる最中

</td><td>止まってる

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

</td><td>ジャンプ中

</td><td>ジャンプしてない

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

</td><td>空中で落ちてる

</td><td>地面に立ってる

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

---

## 🧪 状態チェックは毎フレーム行う！

<span style="white-space: pre-wrap;">ゲームの </span>`<span class="editor-theme-code">Update()</span>`<span style="white-space: pre-wrap;"> 関数の中で、毎フレームこういうチェックをしてます：</span>

```cpp
if (!isFalling) {
    PlayerInput();    // 入力を見て
    PlayerMovement(); // 動かす
} else {
    PlayerFallDown(); // 落下処理
}
```

---

## 📝 イメージでまとめると…

<table id="bkmrk-%E7%8A%B6%E6%85%8B%E6%9D%A1%E4%BB%B6%E8%A1%8C%E5%8B%95%E6%AD%A9%E3%81%8F%E5%89%8D%E3%81%8C%E7%A9%BA%E3%81%84%E3%81%A6%E3%82%8B%E3%82%B9%E3%83%BC%E3%83%83%E3%81%A81%E3%83%9E"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>状態

</th><th>条件

</th><th>行動

</th></tr><tr><td>歩く

</td><td>前が空いてる

</td><td>スーッと1マス進む

</td></tr><tr><td>ジャンプ

</td><td>前にブロック、その上が空

</td><td>ピョンと1段上に乗る

</td></tr><tr><td>落下

</td><td>足元が空（またはジャンプ後）

</td><td>スーッと1段ずつ下がる

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

---

## ✅ ポイントまとめ

- ****状態****は3つだけ：「歩く」「ジャンプ」「落下」
- 条件に応じて****状態を切り替えてるだけ****だから、考え方はシンプル！
- <span style="white-space: pre-wrap;">実際の動きは </span>`<span class="editor-theme-code">moveRatio</span>`<span style="white-space: pre-wrap;"> を使って「ぬるっと動かしてる」</span>