-1
我正在构建一个基于2d瓦的游戏,类似于塞尔达传说游戏,而我的碰撞方法无法正常工作。当玩家远远低于不可通行的瓦片时,该方法将返回碰撞。必须有一个我在这里没有看到的逻辑错误。这是用Java编写的。碰撞法疯了;
从静态碰撞类:
public static boolean collisionAbovePlayer(TileGrid grid, float x, float y, int width, int height) {
boolean collision = false;
for (Tile[] row : grid.map) {
for (Tile t : row) {
// Each Tile t in map:
if (t.getType().getPassable() == false) {
// Each impassable tile:
if ( (x-t.getX() > 0 && x - t.getX() < t.getWidth()) || (x - t.getX() < 0 && Math.abs(x - t.getX()) < width)) {
// Tile is within collision x range
if ((t.getY() + t.getHeight() + 1) - y < Math.abs(5)) {
collision = true;
} else {
collision = false;
}
} else {
collision = false;
}
}
}
}
return collision;
}
这是我Player类被称为用这种方法(我还没有实现对其他方向的碰撞方法还):
public void Update() {
if (first)
first = false;
else {
if ((Keyboard.isKeyDown(Keyboard.KEY_W)) && (!collisionAbovePlayer(grid, x, y, width, height))) {
y -= Delta() * speed;
}
if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
x -= Delta() * speed;
}
if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
y += Delta() * speed;
}
if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
x += Delta() * speed;
}
}
}
设我知道你是否需要查看更多的代码,谢谢你的时间。
你在调试器中通过了这段代码吗? – 2014-09-29 20:36:44
只是三个小的注释:'if(t.getType()。getPassable()== false)'用这个代替'if(!t.getType()。getPassable())'。 'Math.abs(5)'...和'5'不一样吗?最后一个:不要这样做:'collision = true;'。您正在检测碰撞并将其保存到变量中。然后你继续迭代你的循环,如果其他的tile不与玩家碰撞,变量'collision'将被'false'覆盖。如果你检测到一个碰撞,那么'返回true;'而不是。 – Tom 2014-09-29 20:43:17
是的,我不记得我在'Math.abs(5)'中做了什么,但是我原来的设置为1,所以如果不能通过的瓦片是上面的一个像素,它会返回true,但我担心玩家如果'Delta()'太高,精灵可能会跳过它。 – 2014-09-30 01:38:46