Skip to main content

メモ

✅ 目的

例えば「前方に移動できるか?」を調べるには、次の2つを確認すればよい:

① 移動先の 足元がブロックでないか?

② 移動先の プレイヤーの体積にブロックがかぶってないか?


✅ 判定アルゴリズム(擬似コード)

bool CanMoveOrJump(int px, int py, int pz, Direction dir) {
    // 移動先方向オフセット
    int dx, dz;
    std::tie(dx, dz) = GetDirectionOffset(dir);

    // 進行方向のブロック座標
    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; // 1段ジャンプで登れる
    }

    return false; // それ以外は移動不可
}

✅ 判定のための補助関数(例)

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

✅ 方向の扱い

Direction を列挙型で管理しておくと便利です:

enum Direction { FORWARD, BACKWARD, LEFT, RIGHT };

std::pair<int, int> GetDirectionOffset(Direction dir) {
    switch (dir) {
        case FORWARD:  return {  0, -1 };
        case BACKWARD: return {  0,  1 };
        case LEFT:     return { -1,  0 };
        case RIGHT:    return {  1,  0 };
    }
    return {0, 0};
}

✅ まとめ(移動判定に必要なブロック)

判定種別

チェックするブロック

条件

そのまま前進

[x+dx][y][z+dz]

,

[x+dx][y+1][z+dz]

両方が空気ブロック

ジャンプ登れる

[x+dx][y][z+dz]

= 固体、

[y+1],[y+2]

= 空気

1段高いが登れる状態

その他

-

全て満たさない → 進めない


✅ 応用

  • 落下判定も isAir(x, y-1, z) を見れば簡単にできます。