代码之家  ›  专栏  ›  技术社区  ›  1337ingDisorder

Java/libGDX-如何检查多边形与矩形或圆形的碰撞

  •  6
  • 1337ingDisorder  · 技术社区  · 9 年前

    我是libGDX的新手,从中可以看出Intersector类具有矩形/矩形、圆形/圆形、圆形/矩形和多边形/多边形的重叠方法,但由于某些原因,它似乎没有任何检查多边形/矩形或多边形/圆形的方法。

    有没有建议的方法来检查多边形和矩形/圆形之间的碰撞?

    此外,是否有某种原因将其排除在Intersector类之外?(即,我应该避免吗?如果是,建议的替代方案是什么?)

    2 回复  |  直到 9 年前
        1
  •  14
  •   1337ingDisorder    9 年前

    我用于在没有Box2D的情况下实现这些检查的解决方案如下。。

    检查多边形和矩形之间的碰撞:

    // Check if Polygon intersects Rectangle
    private boolean isCollision(Polygon p, Rectangle r) {
        Polygon rPoly = new Polygon(new float[] { 0, 0, r.width, 0, r.width,
                r.height, 0, r.height });
        rPoly.setPosition(r.x, r.y);
        if (Intersector.overlapConvexPolygons(rPoly, p))
            return true;
        return false;
    }
    

    检查多边形和圆之间的碰撞:

    // Check if Polygon intersects Circle
    private boolean isCollision(Polygon p, Circle c) {
        float[] vertices = p.getTransformedVertices();
        Vector2 center = new Vector2(c.x, c.y);
        float squareRadius = c.radius * c.radius;
        for (int i = 0; i < vertices.length; i += 2) {
            if (i == 0) {
                if (Intersector.intersectSegmentCircle(new Vector2(
                        vertices[vertices.length - 2],
                        vertices[vertices.length - 1]), new Vector2(
                        vertices[i], vertices[i + 1]), center, squareRadius))
                    return true;
            } else {
                if (Intersector.intersectSegmentCircle(new Vector2(
                        vertices[i - 2], vertices[i - 1]), new Vector2(
                        vertices[i], vertices[i + 1]), center, squareRadius))
                    return true;
            }
        }
        return false;
    }
    

    此处所示的多边形/圆形支票由克里斯蒂亚诺·桑托斯于 this thread Poly/Rect检查是我想出的快速自制解决方案。

        2
  •  2
  •   dHoja    9 年前

    处理这些冲突的最佳方法是使用像Box2D这样的物理引擎,该引擎已经包含Libgdx。当Box2D中发生冲突时,会触发一个事件,您可以轻松处理该事件。所以你应该看看 here .

    当然,还有其他处理碰撞检测的方法。通过一点数学知识,你可能会自己弄清楚你需要什么,Box2D还提供了许多其他功能,这些功能会让你受益。