Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LibGDX-在不使用tileMap的情况下检测播放器与平台(或平铺)之间的碰撞_Java_Android_Libgdx_Collision Detection_Physics - Fatal编程技术网

Java LibGDX-在不使用tileMap的情况下检测播放器与平台(或平铺)之间的碰撞

Java LibGDX-在不使用tileMap的情况下检测播放器与平台(或平铺)之间的碰撞,java,android,libgdx,collision-detection,physics,Java,Android,Libgdx,Collision Detection,Physics,在我的游戏中,角色不断地从左向右移动,因此永远不会出现他击中平台右侧的情况。我和某人进行了一次非常简短的谈话,他建议我将我的平台建模为4个矩形,这样我在算法中只需要3个案例(即播放器只能与下图中绿色阴影的矩形碰撞)。以下是我的意思的视觉描述: 我试了一下,但碰撞检测还是一团糟。它不会穿过平台的侧面(这是个好消息,因为我们希望它发生),但你不能在上面滑行或在下面弹跳。有人能看出我哪里出了问题吗 public void checkCollisions(ArrayList<GameObject

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

我试了一下,但碰撞检测还是一团糟。它不会穿过平台的侧面(这是个好消息,因为我们希望它发生),但你不能在上面滑行或在下面弹跳。有人能看出我哪里出了问题吗

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);
                    }
                }
            }
        }
    }
} 
公共无效检查冲突(ArrayList列表){
对于(int i=0;i

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

我不能确定这就是问题所在,但您的代码中似乎没有解决这个问题,我自己在忽略这个问题时也遇到过类似的问题。当您的播放器与平台发生碰撞时,意味着其矩形已经与平台相交,距离介于1和像素数之间。仅仅调整x和y速度是不够的。您还必须从平台上移除播放器矩形,否则播放器将被卡住。这可以通过使用循环并检查玩家是否仍在碰撞来实现。如果是这样的话,将1个像素移向你原来的方向,直到不再碰撞。

对不起,我的英语不太好,但我不清楚问题是什么,如果我能澄清我的问题,也许我能帮你。如果你看看我的新编辑,可能会更有意义。我正在尝试在播放器和平台/互动程序之间实现马里奥风格的碰撞检测。玩家可以用3种不同的方式与平台碰撞;通过敲击平台侧面(图中的案例A)、平台顶部或平台底部。当他触到案例A时,我希望玩家的水平速度为0(这样他就不会穿过平台),当他触到案例B时,我希望他的垂直速度为0(这样他就不会从平台上掉下来),案例C:向下弹跳。案例A矩形的宽度为1像素。案例B和C矩形的高度为1像素是的,为什么宽度/高度仅为1像素?你的球员移动有多快。他可以很容易地跳过那个像素,并在红色区域结束。最准确的检测技术可能是存储以前的坐标。所以,当玩家端向上进入某个平铺时,你可以在当前和前一个玩家位置之间“画”一条线,并计算该线和平铺边之间的交点。然后检查什么边相交-顶部、左侧或右侧。有点复杂,但可能更可靠。你是对的,也许1像素宽/高是个坏主意。您知道有任何教程或指南可以演示您所指的技术吗?