3

先生们好日子

我现在想弄清楚如何通过使用平铺对象层为我的玩家执行碰撞检测,更具体地说,我希望它检测我在平铺地图中绘制的折线。当我在 google 中研究 Tiled 的碰撞检测时,我发现了 TiledmapLayer 的这个简单示例superkoala 示例。根据我对代码的理解(如果我错了,请纠正我),为了检测碰撞,玩家将读取某个图层的每个图块,例如包含地面和其他对象的前景图层。

基本上,我对我的对象层所做的是将我的折线命名为 Wall 并且我输入的类型取决于我使用了多少折线。因此,为了将来的使用,我可以为我的碰撞调用这个墙号。

谁能给我一个关于读取对象并将它们用于碰撞检测的示例代码?或者只是一个关于如何解决这个问题的简单提示或想法?任何帮助将不胜感激。

4

2 回答 2

1

在您的情况下,我建议不要使用对象图层,而是使用特定图块的属性。假设您在“平铺”中有一个瓷砖,并且您确定只将其用作墙壁。单击该特定图块并添加“已阻止”属性。然后,在您的代码中,您可以检查玩家旁边的每个单元格,如果它包含“阻塞”属性,则不允许玩家朝那个方向前进。这是我如何做到的伪代码:

private boolean isCellBlocked(float x, float y) {
    Cell cell = null;
    boolean blocked = false;

    try {
        cell = collisionLayer.getCell((int) (x / collisionLayer.getTileWidth()), (int) (y / collisionLayer.getTileHeight()));
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (cell != null && cell.getTile() != null) {
        if (cell.getTile().getProperties().containsKey("blocked")) {
            blocked = true;
        }
    }
    return blocked;
}

并且您可以让玩家在isCellBlocked(x, y)每次更新时调用。

我也collidesSide(float x, float y)为每一面做了一个(collidesTop(float x, float y)等)。

我希望这对您有所帮助,即使它不使用您想要的系统。如需更多帮助,我在一个大型项目中大量使用 libGDX 进行碰撞检测,因此请随时与我联系!

于 2013-12-31T01:25:19.593 回答
0

我遇到了这个问题/答案并想分享我使用的东西,我还没有完全弄清楚一切,但它一直对我有用:

    void buildMap() {
        MapLayer collisionLayer = (MapLayer) map.layers.find { it.name == 'collision' }
        collisionLayer.objects.each { MapObject mapObject ->
            Body body = null

            if(mapObject instanceof RectangleMapObject) {
                Rectangle rectangle = adjustRectangleDimensions(mapObject.rectangle)
                body = bodyFactory.makeBoxPolyBody(
                        rectangle.x,
                        rectangle.y,
                        rectangle.width,
                        rectangle.height,
                        BodyFactory.STONE,
                        BodyDef.BodyType.StaticBody
                )
            }

            if(mapObject instanceof PolygonMapObject) {
                Polygon polygon = adjustPolygonDimensions(mapObject.polygon)
                body = bodyFactory.makePolygonShapeBody(
                        polygon.vertices,
                        polygon.x,
                        polygon.y,
                        BodyFactory.STONE,
                        BodyDef.BodyType.StaticBody
                )
            }


            body.fixtureList.first().filterData.categoryBits = GROUND_BIT
            body.fixtureList.first().filterData.maskBits = PLAYER_BIT // can combine with | if multiple i.e. GROUND_BIT | PLAYER_BIT
        }
    }

    static Rectangle adjustRectangleDimensions(Rectangle rectangle) {
        rectangle.x = rectangle.x * RenderingSystem.PIXELS_TO_METRES * 2 as float
        rectangle.y = rectangle.y * RenderingSystem.PIXELS_TO_METRES * 2 as float
        rectangle.width = rectangle.width * RenderingSystem.PIXELS_TO_METRES * 2 as float
        rectangle.height = rectangle.height * RenderingSystem.PIXELS_TO_METRES * 2 as float
        return rectangle
    }

    static Polygon adjustPolygonDimensions(Polygon polygon) {
        float x = polygon.x * RenderingSystem.PIXELS_TO_METRES as float
        float y = polygon.y * RenderingSystem.PIXELS_TO_METRES as float
        polygon.setPosition(x, y)

        float[] vertices = polygon.vertices //might need to get transformedVertices at some point, seems to work now
        def adjustedVertices = []
        vertices.each {
            adjustedVertices.add(it * RenderingSystem.PIXELS_TO_METRES as float)
        }

        polygon.vertices = adjustedVertices

        return polygon
    }

在这种情况下RenderingSystem.PIXELS_TO_METRES,是我用于 OrthogonalTiledMapRenderer 的单位比例。

我使用的 bodyFactory 可以找到https://github.com/lifeweaver/learningGames/blob/master/core/src/net/stardecimal/game/BodyFactory.groovy

另请参阅https://github.com/yichen0831/Pacman_libGdx/blob/master/core/src/com/ychstudio/builders/WorldBuilder.java以获取另一个示例。

于 2021-06-21T22:32:03.803 回答