LibGDX 如何处理与 ShapeRenderer 的碰撞

How to handle collision with ShapeRenderer in LibGDX

我正在尝试用 LibGDX 为 Android 制作一个小游戏,但在碰撞检测方面遇到了困难。 所以,我有两种形状: 第一个是矩形(玩家):

shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
shapeRenderer.setColor(Color.BLACK);
shapeRenderer.rect(position.x, position.y, width, height);
shapeRenderer.end();

第二个是下面的,有点像笼子:

shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
shapeRenderer.setColor(Color.BLACK);
shapeRenderer.rect(0, 0, 50, Gdx.graphics.getHeight());
shapeRenderer.rect(0, 0, Gdx.graphics.getWidth(), 50);
shapeRenderer.rect(Gdx.graphics.getWidth()-50, 0, 50, Gdx.graphics.getHeight());
shapeRenderer.rect(0, Gdx.graphics.getHeight()-50, Gdx.graphics.getWidth(), 50);
shapeRenderer.end();

我的问题是:

如何检测这两个对象之间的碰撞?我知道如何检测碰撞的唯一方法是使用矩形 class 中的相交方法,但我想制作比矩形更复杂的形状。

感谢您的帮助!

根据文档 ShapeRenderer 效率不高,不应大量使用。

Renders points, lines, rectangles, filled rectangles and boxes. This class is not meant to be used for performance sensitive applications but more oriented towards debugging.

更好的方法可能是分配一个 Sprite 带有小的白色纹理,您可以将其放大到适当的大小。使用 setColor(..) 方法设置色调和 alpha。

对于 Sprite return 边界轴对齐矩形的碰撞 getBoundingRectangle(),这将有助于碰撞。

您可以使用像素图手动创建纹理。

public static Texture createBgTexture() {
    Pixmap pixmap = new Pixmap(1, 1, Format.RGBA8888);
    pixmap.setColor(Color.WHITE);
    pixmap.fill();
    Texture texture = new Texture(pixmap); // must be manually disposed
    pixmap.dispose();

    return texture;
}

对于更复杂的形状,请使用 Physics Body Editor, that will return vertex point of your shape in readable file format, use that points and create Polygon

Libgdx 有 Intersector class,包含许多用于碰撞检测的静态方法,如 intersectPolygons(....) 等等。


另一方面,如果您想要逼真的碰撞检测,您可以在游戏中使用 box2d。在 box2d API 里面有一个 ContactListener 界面,当两个物体碰撞时会告诉你。