碰撞不起作用

时间:2013-05-25 05:21:44

标签: 2d collision-detection lwjgl slick2d

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

这是我的代码:

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 ,因为例如块 x y x = 1 y = 2 表示该块位于第二列和第一行。该方法只是将其转换为像素坐标。

我正在使用LWJGL和Slick2D。帮助

1 个答案:

答案 0 :(得分: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等形状,它将具有在创建对象时创建的大小参数。这意味着contains将检查整个形状。因此,如果该点为260和330,则if语句将为true,因为播放器包含blockPoint。

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

此外,您的代码非常混乱。请缩进!它使世界变得与众不同。