Skip to main content

メモ

🎮 前提条件(仕様)

  • プレイヤーは高さ 2ブロック分の大きさ(頭+胴体)
  • ジャンプは1ブロック分のみ可能
  • ブロック世界は world[x][y][z] のようなグリッドで表現
  • 「今立っている場所」と「前進方向」にあるブロックを調べて移動可能性を判定


🔍 判定に使うブロック範囲(図)

プレイヤーの足元 py として、
進行方向の dx, dz を使って座標 (px+dx, py, pz+dz) などを調べます。

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

[x][y+1][z]   ← 現在地(頭)
[x][y  ][z]   ← 現在地(足)


✅ 判定ロジックまとめ(擬似コード)

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とは?

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


✅ メリット

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

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


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

  1. 歩いてる(=普通に移動)
  2. ジャンプ中(=1段上へピョン!)
  3. 落下中(=足元が空で落ちてる)

🔁 状態の流れ(図っぽく)

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

🧠 状態の切り替え条件(とってもやさしく!)


🚶‍♂️ 歩く状態(isWalking)

● いつこの状態になる?

  • キーボードで前に進むキーを押したとき
  • 進みたい先が 空いてる(ブロックがない)

● 何をする?

  • 少しずつ前に動く
  • 動き終わったら止まる(また入力待ち)

🦘 ジャンプ状態(isJumping)

● いつこの状態になる?

  • 前にブロックがあるけど、
  • その上に空間がある(=乗れる)

● 何をする?

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

🕳️ 落下状態(isFalling)

● いつこの状態になる?

  • 足元に ブロックがない(空中に浮いてる)

● 何をする?

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

🧩 状態フラグで管理(プログラム上)

フラグ

true の意味

false の意味

isWalking

歩いてる最中

止まってる

isJumping

ジャンプ中

ジャンプしてない

isFalling

空中で落ちてる

地面に立ってる


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

ゲームの Update() 関数の中で、毎フレームこういうチェックをしてます:

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

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

状態

条件

行動

歩く

前が空いてる

スーッと1マス進む

ジャンプ

前にブロック、その上が空

ピョンと1段上に乗る

落下

足元が空(またはジャンプ後)

スーッと1段ずつ下がる


✅ ポイントまとめ

  • 状態は3つだけ:「歩く」「ジャンプ」「落下」
  • 条件に応じて状態を切り替えてるだけだから、考え方はシンプル!
  • 実際の動きは moveRatio を使って「ぬるっと動かしてる」