我是libGDX的新手,据我所知,Intersector类有矩形/矩形,圆/圆,圆/矩形和多边形/多边形的重叠方法,但由于某种原因它似乎没有任何检查多边形/矩形或多边形/圆形的方法。
是否有建议的方法来检查多边形与rect / circle之间的碰撞?
此外,是否有一些理由将其排除在Intersector类之外? (即,我应该避免它吗?如果是,建议的替代方案是什么?)
答案 0 :(得分:12)
我在没有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;
}
检查Polygon和Circle之间的碰撞:
// 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检查是我提出的快速自制解决方案。
答案 1 :(得分:2)
处理这些碰撞的最佳方法是使用像Box2D这样的物理引擎,它已经包含了Libgdx。当Box2D发生冲突时,事件会被触发,您可以轻松处理该事件。所以你应该看看here。
当然还有其他处理碰撞检测的方法。通过一些数学运算,您可以自己找出自己需要的东西,Box2D还有很多其他功能可以让您受益。