【问题标题】:Java/libGDX - how to check Polygon collision with Rectangle or CircleJava/libGDX - 如何检查多边形与矩形或圆形的碰撞
【发布时间】:2015-04-15 20:03:24
【问题描述】:

我是 libGDX 的新手,据我所知,Intersector 类具有 Rectangle/Rectangle、Circle/Circle、Circle/Rectangle 和 Polygon/Polygon 的重叠方法,但由于某种原因,它似乎没有检查多边形/矩形或多边形/圆形的任何方法。

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

另外,是否有某些原因将其排除在 Intersector 类之外? (即,我应该避免它吗?如果是,推荐的替代方法是什么?)

【问题讨论】:

    标签: java libgdx collision-detection polygon


    【解决方案1】:

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

    当然还有其他处理碰撞检测的方法。只需一点点数学知识,您可能就可以自己弄清楚您需要什么,而且 Box2D 还提供了许多其他可以让您受益的功能。

    【讨论】:

    • 呵呵,谢谢,我在发布这个问题后不久偶然发现了那个确切的链接。我已将其添加为书签以供查看,但据我所知,它需要从头开始这个项目才能实现 Box2D,因此同时我刚刚实现了自制的 Poly/Rect 检查和 Poly/Circle 检查我在另一个 SO 线程上找到了。不过,我绝对计划在下一个项目中使用 Box2D 框架!
    • 会赞成这个答案,但我需要更多的声望点才能告诉它你回答了我的问题。
    • @1337ingDisorder 很好地实现 Box2D 真的,真的不是问题,即使你已经有了一个大型游戏。您只需创建一个主体并为其配备固定装置和形状,然后只需在这些主体上绘制 Sprite。如果您更喜欢视觉学习者,那么 youtube 上有很多涵盖此主题的视频。不用担心投票,我是来帮忙的……不是为了投票:)
    • 嗯,好的,谢谢,知道尝试解决 Box2D 会更令人鼓舞。我还被告知,复选标记是接受答案,而不是赞成票......而且我不需要代表给复选标记!
    • @1337ingDisorder - 是的,试试吧,花 1 天时间玩 Box2D 已经让你对系统的工作原理有了很大的了解。
    【解决方案2】:

    我用来在没有 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 在 this thread 中编写,Poly/Rect 检查是我想出的一种快速自制解决方案。

    【讨论】:

    • if (Intersector.overlapConvexPolygons(rPoly, p)) return true; return false; 不能这样:return Intersector.overlapConvexPolygons(rPoly, p)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多