Sprite碰撞检测如何工作?

时间:2018-01-23 16:32:58

标签: java libgdx

我试图了解libgdx中两个actor的碰撞检测。 这就是我正在做的事情

Rectangle rect1 = sprite1.getBoundingRectangle();
Rectangle rect2 = sprite2.getBoundingRectangle();
if(rect1.overlaps(rect2))
 //collision occured
else
  //no collision

到目前为止还不错,但是如果你在Actor类中看到了getBoundingRectangle()的代码

    public Rectangle getBoundingRectangle () {
    final float[] vertices = getVertices();

    float minx = vertices[X1];
    float miny = vertices[Y1];
    float maxx = vertices[X1];
    float maxy = vertices[Y1];

    minx = minx > vertices[X2] ? vertices[X2] : minx;
    minx = minx > vertices[X3] ? vertices[X3] : minx;
    minx = minx > vertices[X4] ? vertices[X4] : minx;

    maxx = maxx < vertices[X2] ? vertices[X2] : maxx;
    maxx = maxx < vertices[X3] ? vertices[X3] : maxx;
    maxx = maxx < vertices[X4] ? vertices[X4] : maxx;

    miny = miny > vertices[Y2] ? vertices[Y2] : miny;
    miny = miny > vertices[Y3] ? vertices[Y3] : miny;
    miny = miny > vertices[Y4] ? vertices[Y4] : miny;

    maxy = maxy < vertices[Y2] ? vertices[Y2] : maxy;
    maxy = maxy < vertices[Y3] ? vertices[Y3] : maxy;
    maxy = maxy < vertices[Y4] ? vertices[Y4] : maxy;

    if (bounds == null) bounds = new Rectangle();
    bounds.x = minx;
    bounds.y = miny;
    bounds.width = maxx - minx;
    bounds.height = maxy - miny;
    return bounds;
}

它返回sprite的(minx,miny,x projection,y projection),我们如何根据这些信息确定碰撞,IMO你需要所有四个坐标来确定碰撞对吗?因为在上述情况下,一个面向+ 45°和-45°的矩形可以具有相同的BoundingRectangle。

总结一下这个问题,BoundingRectangle如何用于检测碰撞的信息,是不是丢失了一些信息?

1 个答案:

答案 0 :(得分:1)

Sprite碰撞检测的工作原理是检查两个对象的x和y值是否共享一个坐标。 如果发生这种情况,那么您就知道对象已经发生碰撞。对象的xy值还包括形状内的值。

但是,有几种方法可以检查他们是否共享xy坐标而不检查所有可能性。

  • 对于x值,您可以检查其他形状是否在x位置和x位置+ width之间。

  • 对于y值,您可以检查其他形状是否在y位置和y位置+ height之间。

这会根据边的形状和数量而变化。