好的,所以我目前正在制作 2D 自上而下的视图游戏,但我不确定您是如何创建迷宫的。但是,在我的游戏中,我的关卡是从 Tile[][] tiles = new Tile[levelWidth][levelHeight]; 创建的。大批。我处理碰撞检测的方法是检查周围的瓷砖,看看它们是否坚固。
这是我的 getTile 方法。
public Tile[][] getTile(int x, int y) {
if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight()) {
return new VoidTile();
} else {
return tiles[x][y];
}
}
在我的 Tile.java 类中,我有一个 isSolid() 方法,它返回瓷砖是否是实心的。我所有的图块都扩展了我的 Tile.java,所以它们继承了这个方法,我在它们的构造函数中重写了它。正如我之前所说,我不确定您是否使用与我相同的关卡实现方式。但是,这样做是一种很好的做法:)
就个人而言,我不太喜欢使用 .intersects() 和 .contains() 方法进行 Sprite 碰撞检测。我主要将它们用于按钮等。
好的,在我的 player.java 类中,我有一个 checkBlockedDirection(int x, int y) 方法,它看起来像这样。
public void checkBlockedDirection(int x, int y) {
boolean u = map.getTile(x, y - 1).isSolid();
boolean d = map.getTile(x, y + 1).isSolid();
boolean l = map.getTile(x - 1, y).isSolid();
boolean r = map.getTile(x + 1, y).isSolid();
if (u) {
uBlocked = true;
System.out.println("up tile blocked");
} else {
uBlocked = false;
}
if (d) {
dBlocked = true;
System.out.println("down tile blocked");
} else {
dBlocked = false;
}
if (l) {
lBlocked = true;
System.out.println("left tile blocked");
} else {
lBlocked = false;
}
if (r) {
rBlocked = true;
System.out.println("right tile blocked");
} else {
rBlocked = false;
}
}
然后在我的播放器更新方法中我有这个
public void tick() {
float dx = 0;
float dy = 0;
if (input.up.isPressed()) {
direction = 0;
} else if (input.down.isPressed()) {
direction = 2;
} else if (input.left.isPressed()) {
direction = 3;
} else if (input.right.isPressed()) {
direction = 1;
} else {
direction = 4; // standing
}
checkBlockedDirection((int)x, (int)y);
if (input.up.isPressed() && y > 0 && !uBlocked) {
dy += -speed;
} else if (input.down.isPressed() && y < map.getHeight() - 1 && !dBlocked) {
dy += speed;
} else if (input.left.isPressed() && x > 0 && !lBlocked) {
dx += -speed;
} else if (input.right.isPressed() && x < map.getWidth() - 1 && !rBlocked) {
dx += speed;
}
x += dx;
y += dy;
}
基本上它只是检查上、下、左或右的块是否是实心的。如果它们是实心的,那么它不会移动,如果它们不是实心的,那么您可以朝所需的方向移动。
不确定这是否有帮助,但这只是我对这种网格碰撞检测的看法:)
希望这可以帮助 :)
享受