LibGDX - 播放器和平台(或平铺)之间的碰撞检测,不使用TiledMap

时间:2015-01-20 19:58:23

标签: java android libgdx collision-detection physics

在我的游戏中,角色不断从左向右移动,因此永远不会出现他击中平台右侧的情况。我与某人进行了非常简短的交谈,他建议我将我的平台建模为4个矩形,这样我的算法中只需要3个案例(即播放器只能与绿色的矩形相撞)图片如下)。这是对我的意思的直观描述:

enter image description here

我试一试,但碰撞检测仍然搞砸了。它并没有通过平台的一侧(这是好消息,因为我们希望这种情况发生),但你不能在它上面滑行或在它下面反弹。谁能看到我可能出错的地方?

public void checkCollisions(ArrayList<GameObject> list) {

    for (int i = 0; i < list.size(); i++) {
        for (int j = i + 1; j < list.size(); j++) {
            GameObject go1 = list.get(i);
            GameObject go2 = list.get(j);
            boolean playerPlatformCollision = go1.getType()
                    .equalsIgnoreCase("player") && go2.getType().equalsIgnoreCase("platform");
            if (playerPlatformCollision) {
              Rectangle playerRect = go1.getRect();
              Rectangle platformRect = go2.getRect();
                if (playerRect.overlaps(platformRect)) {

                    float platformRectX, platformRectY, platformRectWidth, platformRectHeight;
                    platformRectX = go2.getRect().getX(); // x position of the platform
                    platformRectY = go2.getRect().getY(); // y position of the platform
                    platformRectWidth = go2.getRect().getWidth(); // width of platform
                    platformRectHeight = go2.getRect().getHeight(); // height of platform

                    Rectangle caseA = new Rectangle(platformRectX,
                            platformRectY, platformRectX + 1,
                            platformRectHeight);
                    Rectangle caseB = new Rectangle(platformRectX + 1,
                            (platformRectY + platformRectHeight) - 1,
                            platformRectWidth - 1, platformRectHeight);
                    Rectangle caseC = new Rectangle(platformRectX + 1,
                            platformRectY, platformRectWidth, 1);

                    if (playerRect.overlaps(caseA)) {
                        go1.setxSpeed(0);
                    } else if (playerRect.overlaps(caseB)) {
                        go1.setySpeed(0);
                    } else if (playerRect.overlaps(caseC)) {
                        go1.setySpeed(-3f);
                    }
                }
            }
        }
    }
} 

如果您不清楚代码的任何部分,请告诉我。

1 个答案:

答案 0 :(得分:0)

我无法确定这是问题所在,但似乎您的代码中没有解决此问题,并且在忽略此问题时我自己也遇到过类似的问题。当你的玩家与平台发生碰撞时,这意味着它的矩形已经与平台相交,在1和你的像素数之间的任何地方。仅调整x和y速度是不够的。您还必须从平台中删除播放器矩形,否则播放器将卡住。这可以通过使用循环并检查您的播放器是否仍然发生碰撞来完成。如果是这样,请沿着您的方向移动1个像素,直到不再发生碰撞。