碰撞方法疯了;

时间:2014-09-29 20:31:39

标签: java collision-detection lwjgl

我正在构建一个基于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;
        }
    }
}

如果您需要查看更多代码,请告诉我,谢谢您的时间。

1 个答案:

答案 0 :(得分:1)

修正:

public static boolean collisionAbovePlayer(TileGrid grid, float x, float y, int width, int height) {

    for (Tile[] row : grid.map) {
        for (Tile t : row) {

            // Each Tile t in map:

            if (!t.getType().getPassable()) {

                // 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

                    System.out.println("IN X RANGE");

                    if (Math.abs((t.getY() + t.getHeight() + 1) - y) < 2) {
                        return true;
                    }

                }
            }
        }
    }

    return false;
}

在原始代码中,它只返回设置'boolean collision'的最后一个tile为true,并且检查Y的最终语句需要Math.abs()围绕第一个值。