Libgdx矩形墙碰撞

时间:2017-01-14 16:08:17

标签: libgdx collision-detection rectangles

我一直试图在Libgdx中找到/创建矩形的碰撞检测,但我似乎无法到达任何地方。我有一个叫做水桶的宽度和高度为64的长方形和一个叫做宽度和高度为64的长方形的矩形。我试图让玩家不穿过矩形并且可以继续移动而坚持墙没有逐步通过或随机传送。我的方法在有1个区块时有效,但是当有多个区块时,它只会中断并且不起作用。

我知道这种方法很难看但只是实验

private void checkCollisions(Rectangle bucket, Wall wall){
    if(bucket.overlaps(wall.getRectangle())){
        if(bucket.x > wall.getRectangle().x - 64 && bucket.x < wall.getRectangle().x - 55){
            //collision with right side
            bucket.x = wall.getRectangle().x - 64;
        }
        if(bucket.x < wall.getRectangle().x + 64 && bucket.x > wall.getRectangle().x + 55){
            //collision with left side 
            bucket.x = wall.getRectangle().y + 64;
        }                           
        if(bucket.y < wall.getRectangle().y + 64 && bucket.y > wall.getRectangle().y + 55){
            //collision with top side 
            bucket.y = wall.getRectangle().y + 64;
        }                             
        if(bucket.y > wall.getRectangle().y - 64 && bucket.y < wall.getRectangle().y - 55){
            //collision with bottom side
            bucket.y = wall.getRectangle().y - 64;
        }
    }
}

如果有人能指出我正确的方向或分享一些能帮助我的代码,我将非常感激。

1 个答案:

答案 0 :(得分:1)

LibGDX查看碰撞检测时,您必须首先注意默认LibGDX坐标系的两个重要方面。

  • 绘制图像时,其(x,y)坐标位于图像的左下角
  • (0,0)是屏幕的左下角

使用此信息,我们可以将您的碰撞逻辑修复为以下内容:

private void checkCollisions(Rectangle bucket, Wall wall){
    if(bucket.overlaps(wall.getRectangle())){
        if(bucket.x + 64 > wall.getRectangle().x && bucket.x < wall.getRectangle().x){
            //collision with right side of bucket
        }
        if(bucket.x < wall.getRectangle().x + 64 && bucket.x > wall.getRectangle().x){
            //collision with left side of bucket
        }                           
        if(bucket.y + 64 > wall.getRectangle().y && bucket.y < wall.getRectangle().y){
            //collision with top side of bucket
        }                             
        if(bucket.y < wall.getRectangle().y + 64 && bucket.y > wall.getRectangle().y){
            //collision with bottom side of bucket
        }
    }
}

此方法将确定存储桶的哪一侧检测到与默认LibGDX坐标系的碰撞。