0

我的游戏碰撞有问题。游戏是“基于平铺的”。当我放置一个应该阻止玩家走进它的瓷砖时,问题就出现了,它会在瓷砖附近产生一个无限的垂直和水平屏障。

这是我的代码:

double d = delta;
Point oldVerticalPoint = new Point(point.getX(), point.getY());
if (Keyboard.isKeyDown(Keyboard.KEY_UP))
    point.setY((float) (point.getY() - (speed * d)));
if (Keyboard.isKeyDown(Keyboard.KEY_DOWN))
    point.setY((float) (point.getY() + (speed * d)));
for (int x = 1; x <= game.map.width; x++) {
    for (int y = 1; y <= game.map.height; y++) {
        Block block = game.map.getBlock(x, y);
        if (block instanceof BlockWall) {
            BlockWall b = (BlockWall) block;
            Point blockPoint = Block.getStandardBlockCoords(x, y);
            Point playerPoint = game.thePlayer.point;
            if (playerPoint.getY() > blockPoint.getY() && playerPoint.getY() < <blockPoint.getY() + Block.LENGTH)
                game.thePlayer.point = oldVerticalPoint;
        }
    }
}

Point oldHorizontalPoint = new Point(point.getX(), point.getY());;
if (Keyboard.isKeyDown(Keyboard.KEY_LEFT))
    point.setX((float) (point.getX() - (speed * d)));
if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT))
    point.setX((float) (point.getX() + (speed * d)));
for (int x = 1; x <= game.map.width; x++) {
    for (int y = 1; y <= game.map.height; y++) {
        Block block = game.map.getBlock(x, y);
        if (block instanceof BlockWall) {
            BlockWall b = (BlockWall) block;
            Point blockPoint = Block.getStandardBlockCoords(x, y);
            Point playerPoint = game.thePlayer.point;
            if (playerPoint.getX() > blockPoint.getX() && playerPoint.getX() < blockPoint.getX() + Block.LENGTH)
                game.thePlayer.point = oldHorizontalPoint;
        }
    }
}

我不知道它为什么这样做。需要明确的一点是,为什么会有两次碰撞检测,所以如果玩家水平移动到墙壁上并且在诸如简单瓷砖之类的东西上垂直移动,玩家将不会完全停止移动。还使用getStandardBlockCoords,因为例如,如果块xyx = 1y = 2,则意味着该块位于第二列和第一行。该方法只是将其转换为像素坐标。

我正在使用 LWJGL 和 Slick2D。帮助?

4

1 回答 1

1

您应该使用 Slick 的方法来检测碰撞。那将是一个非常好的主意。

if (block instanceof BlockWall)
   {
        BlockWall b = (BlockWall)block;
        Point blockPoint= Block.getStandardBlockCoords(x, y);
        Point playerPoint = game.thePlayer.point;
            //You should use playerPoint.contains(blockPoint){ };
        if (playerPoint.getY() > blockPoint.getY() && playerPoint.getY() <
            blockPoint.getY() + Block.LENGTH)
            game.thePlayer.point = oldVerticalPoint; 
        }
    }
}

现在您的代码和我的代码存在问题。

您的代码:您的代码将提取 2 个点,一个 X 和 Y 位置。它只会验证那些点。假设您的块在 x = 250 和 y = 300 时为 30 x 50。现在,您希望能够检查整个块。但是,它仅检查 X 和 Y 位置。

if(playerPoint.contains(blockPoint)){
    //if only playerPoint x = 250 and y = 300 will this ever be true
}

因此,如果您要检查 x = 260 和 y = 330,则 if 语句将返回 false,因为这些点不包含彼此。现在,如果您使用 Rectangle、Polygon 等形状,它将有一个 size 参数,该参数将在创建对象时创建。这意味着contains将检查整个形状。所以如果点是 260 和 330,if 语句就会成立,因为玩家包含 blockPoint。

如果这没有意义,请告诉我,如果需要,我会进一步解释。

你的代码也很混乱。请缩进!它让世界变得与众不同。

于 2013-05-25T07:10:11.320 回答