我已经做了 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);
}
我有一个函数可以保存对象所做的所有位置移动。因此,当发生碰撞时,对象恢复到最后一次移动之前的前一次移动(因为最后一次移动是发生碰撞时)(下面的示例):
private void overlapsTop(Entity object, Rectangle wall){
Rectangle r = new Rectangle();
if(spritePositions.size() != 0){
r = spritePositions.get(spritePositions.size()-1);
}
object.update(r.x, r.y, r.width, r.height);
object.getObject().setBounds(r.x, r.y, r.width, r.height);
spritePositions.clear();
}
附加信息:我正在这样移动我的对象:
public void moveRight(){
position.x += 1f;
update();
}
public void update(){
boundingRectangle.set(position.x, position.y, object.getWidth(), object.getHeight());
}
我卡住的地方是我的重叠函数(我在 SO 中找到的函数)。它适用于大多数情况;然而,例如,如果对象移动到右边的墙附近并接触到它,则该函数返回 true 并执行所有操作。但是假设如果我沿着墙壁滑动并直接向下移动并且没有墙壁,物体会停在一个点,因为它检测到物体底部和墙壁顶部(当没有墙壁时)之间的碰撞并且物体右侧与墙壁左侧的碰撞。
我正试图为此寻找另一种解决方案。我只希望我的物体停在任何墙壁上并且能够移动(或滑下墙壁)而不用怀疑附近没有墙壁的地方可能会发生碰撞。我觉得我非常接近解决方案,但我需要一些额外的帮助。
更新
我已经更新了 moveRight 函数和更新函数。 @Adrian Shum 和@Matthew Mark Miller 我现在用一个整数来制作所有东西(意思是我使用 1f 而不是 0.01f)。
因此我用来移动对象的以下代码是这样的:
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,则不能保证您回到原始值。您可能会多一点或少一点,因为中间结果可能无法表示为 float 。
我最喜欢的例子:.1f + .2f > .3f
关于java - 矩形之间的碰撞检测(无重叠)- libgdx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31008723/