我已经在这里待了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我目前正在使用一个重叠方法,我在其中找到了这个方法。下面是我的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());
}我被卡住的地方是我的重叠函数(我在其中找到的)。它可以在大多数情况下工作;但是,例如,如果对象在右边的墙壁附近移动并接触它,则函数返回true并执行所有操作。但假设我沿着墙直接向下移动,没有墙,物体就会停在一点上,因为它检测到物体底部和墙壁顶部之间的碰撞(当没有的时候),以及物体的右侧和墙的左边之间的碰撞。
我想找另一个解决办法。我只想让我的物体停在任何一堵墙前,能够移动(或滑下一堵墙),而不用担心附近没有墙的地方可能会发生碰撞。我觉得我离解决方案很近,但我需要一些额外的帮助。
更新
我更新了moveRight函数和更新函数。@禤浩焯Shum和马修马克米勒我现在用一个整数做了所有的事情(意思不是0.01f,我用1f)。
因此,用于移动对象的以下代码如下所示:
if(Gdx.input.isKeyPressed(Keys.RIGHT)){
if(collisionManager.canSpriteNotMoveRight(object)){
object.stopGoingRight();
}else{
object.moveRight();
}
}在我的collisionManager类中,函数stopGoingRight如下:
public void stopGoingRight(){
position.x -= 1f;
update();
}到现在为止还好。当物体与墙壁相撞时,物体会停下来并反弹回来。那很好。但我有另一个问题(这是令人恼火的),我将尽力描述我能做的最好的事情。例如,如果我一直把物体移动到墙上,物体会从墙上弹回来很多次;如果我停止按向上键,物体有时会被困在墙上。因此,当我按下键时,它会向上而不是向下(或者如果我按左键,对象就会右转而不是左转),因为重叠函数会被执行(因为object和wall都相交)。
我有办法解决这个问题吗?似乎Libgdx并不完全适合处理这种碰撞检测,但我现在正在深入构建我的游戏。
发布于 2015-06-29 02:28:03
我终于找到了一个很好的解决方案,这都要归功于以下链接:On overlap, player gets stuck libgdx Rectangle。
基本上,我必须创造一个“假的”移动,看看物体是否会与墙壁碰撞。如果有碰撞,我只是停止对象和不执行新的移动。
谢谢大家的帮助:!!非常感谢!!
发布于 2015-06-26 02:52:34
您的碰撞算法看起来冗长但正确(因为x的最小值,x+宽度总是只有x,因为宽度必须是>= 0,反之亦然)。
你考虑过这是浮点精度问题的可能性吗?例如,如果将1添加到fp编号,然后从结果中删除1,则不能保证返回原来的值。您可能或多或少是因为中间结果可能无法表示为浮点数。
我最喜欢的例子:.1f + .2f > .3f
https://stackoverflow.com/questions/31008723
复制相似问题