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

7
我是一个新手,正在学习libGDX。从我所了解的情况来看,Intersector类具有用于Rectangle/Rectangle、Circle/Circle、Circle/Rectangle和Polygon/Polygon的重叠方法,但由于某种原因,它似乎没有任何用于检查Polygon/Rectangle或Polygon/Circle的方法。
请问有没有推荐的方法来检查多边形和矩形/圆形之间的碰撞?
此外,为什么Intersector类中会缺少这些方法?(如果需要避免使用,则应该使用什么替代方法?)
2个回答

14

我用以下方法实现了这些检查,而不使用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;
}

这里所展示的Poly/Circle检测是由Cristiano Santos在这个帖子中编写的,而Poly/Rect检测是我想出的一个快速自制解决方案。


if (Intersector.overlapConvexPolygons(rPoly, p)) return true; return false;couldn't this just be:return Intersector.overlapConvexPolygons(rPoly, p) - Wolforce

2
处理这些碰撞的最佳方式是使用物理引擎,例如Box2D,它已经与Libgdx捆绑在一起。当Box2D中发生碰撞时,会触发一个事件,您可以轻松处理该事件。因此,您应该在这里查看:https://github.com/libgdx/libgdx/wiki/Box2d
当然,还有其他处理碰撞检测的方法。通过一点数学计算,您可能可以自己找出所需的内容,此外,Box2D还带有许多其他功能,这将使您受益匪浅。

谢谢,实际上我在发布这个问题后不久就偶然发现了那个链接。我已经将它加为书签以便研究,虽然据我所知,它需要从头开始重新启动这个项目才能实现Box2D,所以在此期间我只是实现了一个自制的Poly/Rect检查和我在另一个SO线程中找到的一个Poly/Circle检查。但我肯定计划在下一个项目中使用Box2D框架! - 1337ingDisorder
我想点赞你的答案,但是SO要求我必须有更多的声望才能告诉它你已经回答了我的问题。 - 1337ingDisorder
@1337ingDisorder 实现Box2D真的不是问题,即使你已经有一个大型游戏。你只需创建一个物体并装备它与Fixture和Shape,然后在这些物体上简单地绘制Sprite。如果你更喜欢视觉学习,YouTube上有很多涵盖这个主题的视频。不用担心点赞,我在这里是来帮忙的...而不是为了得到点赞 :) - dHoja
嗯,好的,知道这一点让我更有动力尝试解决Box2D。我也被告知,在这里打钩是为了接受答案,而不是点赞...而且我不需要声望来打钩! - 1337ingDisorder
@1337ingDisorder - 是的,试试吧,花一天时间玩Box2D就能让你对系统的工作原理有很大的了解。 - dHoja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接