当前位置: 首页 > 知识库问答 >
问题:

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

高兴贤
2023-03-14

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

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

另外,为什么这被排除在跨部门类之外,有什么原因吗?(即,我应该避免它吗?如果是这样,推荐的替代方案是什么?

共有2个答案

陆弘光
2023-03-14

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

当然,还有其他处理碰撞检测的方法。通过一点数学知识,你很可能就能自己算出你需要什么,而且Box2D还附带了很多其他的功能,这些功能会让你受益匪浅。

向俊贤
2023-03-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检查是我提出的一个快速自制解决方案。

 类似资料:
  • 我在Android Studio中使用libgdx,并且我正在使用精灵碰撞检测。我需要知道如何检测两个形状不规则的精灵之间的碰撞。我的精灵是从png图像纹理创建的。是否可以使用子画面的边框作为检测表面?使用在子画面周围绘制的矩形或圆形将不够准确。感谢您的帮助!

  • 问题内容: Libgdx中是否可以验证多边形和圆之间的碰撞? 我看到了课程,但只发现了Circle和Rectangle的碰撞测试。那其他多边形呢? 如果我需要手动进行操作,那么使用Libgdx的最佳方法是什么? 问题答案: 因此,我设法在Circle和Polygon之间创建了碰撞测试方法。至少,它对我有用。 这是代码:

  • 为什么这工作正常: 这会产生运行时错误 错误: 这没有任何意义。第一个代码工作正常,三角形画好了,但第二个代码不行。有人能解释一下我做错了什么吗...

  • 好的,我想试试这个: > 然后检查碰撞检测,如图所示。第一种是正面碰撞,第二种是侧面碰撞。碰撞http://img802.imageshack.us/img802/2934/rectangles2.png 然后删除精灵,只保留代码中的向量。(位置和旋转)我希望如此,因为我想在这些位置添加3d Cars和他的旋转。我的意思是,在2d中没有精灵的碰撞检测。 在游戏结束时,将没有精灵。仅三维对象。 有人

  • 在我的情况下,矩形接触圆形,但我认为没关系。 起初,我试着用两个Ficture来做同样的身体,但旋转有一个问题:我不能有一个带旋转的Ficture,另一个没有。 我认为,它应该与关节有某种联系,但我不知道我应该使用什么关节。也许还有其他解决方案?

  • 我花了数小时寻找解决方案:我正在用libgdx开发一个自上而下的小游戏(可能这与我使用的引擎有关)。现在我必须在我的角色(圆形)和墙(矩形)之间实现碰撞检测。如果可以滑动,我希望角色在碰撞时沿着墙滑动。让我解释一下: 如果我向上移动45度,我可能会撞到墙的下面、左边或角落。 如果我与左边相撞,我想停止x运动,只向上移动。如果我离开墙壁,那么我想继续向上移动。与下侧相同(停止y运动) 如果我与角落相