メモ
✅ 目的
例えば「前方に移動できるか?」を調べるには、次の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};
}✅ まとめ(移動判定に必要なブロック)
判定種別 | チェックするブロック | 条件 |
|---|---|---|
そのまま前進 |
,
| 両方が空気ブロック |
ジャンプ登れる |
= 固体、
= 空気 | 1段高いが登れる状態 |
その他 | - | 全て満たさない → 進めない |
✅ 応用
- 落下判定も
isAir(x, y-1, z)を見れば簡単にできます。