Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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_Java_Libgdx_Collision Detection_Collision_Maze - Fatal编程技术网

Java 矩形之间的碰撞检测(无重叠)-libgdx

Java 矩形之间的碰撞检测(无重叠)-libgdx,java,libgdx,collision-detection,collision,maze,Java,Libgdx,Collision Detection,Collision,Maze,我已经这样做了2-3周了,但我仍然无法进行正确的碰撞检测。我用矩形创建了一个迷宫。我希望我的对象(位于矩形中)在我的对象与任何墙碰撞时停止,并能够移动到任何地方(或从墙上滑下)。我的墙(矩形)具有负坐标,如下所示: shapeRenderer.rect(0.9f, 12, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); //NORTH shapeRenderer.rect(1, 12, 0, -1.05f, Color.RED, Co

我已经这样做了2-3周了,但我仍然无法进行正确的碰撞检测。我用矩形创建了一个迷宫。我希望我的对象(位于矩形中)在我的对象与任何墙碰撞时停止,并能够移动到任何地方(或从墙上滑下)。我的墙(矩形)具有负坐标,如下所示:

shapeRenderer.rect(0.9f, 12, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); //NORTH
shapeRenderer.rect(1, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // WEST
shapeRenderer.rect(2, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // EAST
shapeRenderer.rect(0.9f, 11, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); // SOUTH
我目前正在使用我在SO中发现的重叠方法。下面是我的CollisionManager类中的方法:

private boolean overlaps (Rectangle collision, Rectangle wall) {
    return Math.min(collision.x, collision.x + collision.width) 
        < Math.max(wall.x, wall.x + wall.width) 
    && Math.max(collision.x, collision.x + collision.width) 
        > Math.min(wall.x, wall.x + wall.width) 
    && Math.min(collision.y, collision.y + collision.height) 
        < Math.max(wall.y, wall.y + wall.height) 
    && Math.max(collision.y, collision.y + collision.height) 
        > Math.min(wall.y, wall.y + wall.height);
}
附加信息:我正在像这样移动我的对象:

public void moveRight(){
    position.x += 1f;
    update();
}

public void update(){

      boundingRectangle.set(position.x, position.y, object.getWidth(), object.getHeight());
}
if(Gdx.input.isKeyPressed(Keys.RIGHT)){

                 if(collisionManager.canSpriteNotMoveRight(object)){
                     object.stopGoingRight();
                 }else{
                     object.moveRight();
                 }
             }
我陷入困境的是我的重叠函数(我在SO中找到的那个)。它在大多数情况下都有效;然而,例如,如果对象靠近右侧的墙移动并接触到它,函数将返回true,所有内容都将执行。但假设我沿着墙滑动并直接向下移动,并且没有墙,对象会在某个点停止,因为它检测到对象底部和墙顶部之间的碰撞(如果没有),以及对象右侧和墙左侧之间的碰撞

我正试图找到另一个解决办法。我只想让我的物体停在任何一堵墙上,并且能够移动(或滑下一堵墙),而不会怀疑附近没有墙的地方可能会发生碰撞。我觉得我很快就能找到解决办法了,但我需要一点额外的帮助

更新

我已经更新了moveRight函数和update函数@Adrian Shum和@Matthew Mark Miller我现在用一个整数制作了所有东西(意思是用1f代替0.01f)

因此,我用于移动对象的以下代码如下所示:

public void moveRight(){
    position.x += 1f;
    update();
}

public void update(){

      boundingRectangle.set(position.x, position.y, object.getWidth(), object.getHeight());
}
if(Gdx.input.isKeyPressed(Keys.RIGHT)){

                 if(collisionManager.canSpriteNotMoveRight(object)){
                     object.stopGoingRight();
                 }else{
                     object.moveRight();
                 }
             }
在我的collisionManager类中,函数stopGoingRight如下所示:

public void stopGoingRight(){
    position.x -= 1f;
    update();
}
到目前为止,一切顺利。当对象与墙碰撞时,对象停止并反弹。那很好。但我还有另一个问题(令人恼火),我会尽我所能描述。例如,如果我一直将对象向上移动到墙上,对象将多次从墙上反弹回来;如果我停止按向上键,物体有时会卡在墙上。因此,当我按下向下键时,它将向上而不是向下(或者如果我按下向左键,对象将向右而不是向左),因为会执行重叠功能(因为对象和墙都相交)


我有办法解决这个问题吗?似乎Libgdx并不完全适合处理这种碰撞检测,但我现在正在深入构建我的游戏

您的碰撞算法看起来冗长但正确(冗长是因为x的最小值,x+宽度始终仅为x,因为宽度必须>=0,而最大值则相反)

您是否考虑过这可能是一个浮点精度问题?例如,如果将1添加到fp编号,然后从结果中删除1,则不能保证返回原始值。你可能会有点多多少少,因为中间结果可能无法表示为浮动


我最喜欢的示例:.1f+.2f>.3f

由于以下链接,我终于找到了一个好的解决方案:

基本上,我必须创建一个“假”移动来查看对象是否会与墙碰撞。如果发生碰撞,我只是停止对象,不执行新的移动


谢谢大家的帮助:)!!非常感谢

你控制的矩形可以旋转吗?或者你只是在旋转它的方向?是的,你可以控制它的旋转。基本上,当你向下、向上、向右或向左移动时,对象会相应地旋转。只是一个想法可能会有所帮助:正如其他人所提到的,这可能是由于浮点数的精度问题造成的。如果你知道你的迷宫/运动等将是,比方说,处理最小值0.01,那么试着在你的
重叠中做一个ε调整(可能使用0.005),这样就不用写
a
,而是写
a
,或者,把所有东西都变成整数。@code。如果负坐标是唯一的问题,那么您可以在检查交叉点之前将平移应用于垂直或水平方向的两个矩形或两个方向,然后使用反向平移。:)