首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矩形之间的碰撞检测(无重叠)- libgdx

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

Stack Overflow用户
提问于 2015-06-23 16:46:28
回答 2查看 3.8K关注 0票数 9

我已经在这里待了2-3周了,我还是没办法找到合适的碰撞检测。我用矩形创建了一个迷宫。我希望我的对象(在矩形中)在物体与任何墙壁碰撞时停止,并能够在任何地方移动(或滑下墙壁)。我的墙壁(矩形)具有负坐标,如下所示:

代码语言:javascript
复制
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类中的方法:

代码语言:javascript
复制
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);
}

我有一个函数,它保存对象所做的所有位置移动。因此,当发生碰撞时,对象恢复到上次移动之前的前一步(因为最后一次移动是在发生碰撞时)(例如下面):

代码语言:javascript
复制
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();
}

附加信息:我要像这样移动对象:

代码语言:javascript
复制
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)。

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

代码语言:javascript
复制
if(Gdx.input.isKeyPressed(Keys.RIGHT)){

                 if(collisionManager.canSpriteNotMoveRight(object)){
                     object.stopGoingRight();
                 }else{
                     object.moveRight();
                 }
             }

在我的collisionManager类中,函数stopGoingRight如下:

代码语言:javascript
复制
public void stopGoingRight(){
    position.x -= 1f;
    update();
}

到现在为止还好。当物体与墙壁相撞时,物体会停下来并反弹回来。那很好。但我有另一个问题(这是令人恼火的),我将尽力描述我能做的最好的事情。例如,如果我一直把物体移动到墙上,物体会从墙上弹回来很多次;如果我停止按向上键,物体有时会被困在墙上。因此,当我按下键时,它会向上而不是向下(或者如果我按左键,对象就会右转而不是左转),因为重叠函数会被执行(因为object和wall都相交)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-29 02:28:03

我终于找到了一个很好的解决方案,这都要归功于以下链接:On overlap, player gets stuck libgdx Rectangle

基本上,我必须创造一个“假的”移动,看看物体是否会与墙壁碰撞。如果有碰撞,我只是停止对象和不执行新的移动。

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

票数 4
EN

Stack Overflow用户

发布于 2015-06-26 02:52:34

您的碰撞算法看起来冗长但正确(因为x的最小值,x+宽度总是只有x,因为宽度必须是>= 0,反之亦然)。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31008723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档