Libgdx:Tiled Objects图层用于碰撞

时间:2013-07-26 08:18:47

标签: java android collision-detection libgdx tile

好日子先生,

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

基本上,我对我的对象层所做的是将我的折线命名为Wall,并根据我使用的折线数量输入数字。因此,为了将来使用,我可以将此墙数称为我的碰撞。

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

2 个答案:

答案 0 :(得分:1)

我建议你做的是不要使用对象图层,而是使用特定图块的属性。假设你在'Tiled'中有一块瓷砖,你肯定只能用它作墙。单击该特定磁贴并添加属性“已阻止”。然后,在您的代码中,您可以检查播放器旁边的每个单元格,如果它包含“已阻止”属性,则不允许玩家朝那个方向前进。这是我如何做到的伪代码:

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进行碰撞检测,所以不要犹豫与我联系!

答案 1 :(得分: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 以获取另一个示例。