【问题标题】:Libgdx Collision Detection with TiledMap使用 TiledMap 的 Libgdx 碰撞检测
【发布时间】:2013-12-02 12:25:41
【问题描述】:

我正在努力通过平铺地图实现碰撞检测系统。我有一个渲染了平铺地图的 2d“口袋妖怪风格”游戏。具体来说,我的平铺地图 .tmx 文件中有一个“碰撞”层,我想与玩家和其他实体进行交互。我的问题是如何将玩家精灵(扩展 Sprite 类)连接到平铺地图的“碰撞”层并导致两者之间发生碰撞。任何建议表示赞赏。

【问题讨论】:

    标签: java libgdx collision-detection


    【解决方案1】:

    首先,您的Player 可能不应该是extend Sprite,因为您的播放器通常不仅仅是Sprite。它可能由几个精灵甚至Animations 组成。将精灵作为玩家的属性。

    这个问题本身已经讨论过好几次了。您通常需要以下步骤:

    1. 在地图中查找碰撞层
    2. 从该层中提取所有对象
    3. 检查每个对象是否发生碰撞

    在代码中可能有点像这样:

    int objectLayerId = 5;
    TiledMapTileLayer collisionObjectLayer = (TiledMapTileLayer)map.getLayers().get(objectLayerId);
    MapObjects objects = collisionObjectLayer.getObjects();
    
    // there are several other types, Rectangle is probably the most common one
    for (RectangleMapObject rectangleObject : objects.getByType(RectangleMapObject.class)) {
    
        Rectangle rectangle = rectangleObject.getRectangle();
        if (Intersector.overlaps(rectangle, player.getRectangle()) {
            // collision happened
        }
    }
    

    更多您可能感兴趣的链接:

    【讨论】:

    • 我实现了您的代码,但对象返回的计数为 0,并且循环永远不会运行。知道那可能是什么吗?我的图层中没有任何对象,我只有一个充当不需要碰撞的背景的图层和一个充当玩家可以碰撞的图块的图层。
    • 当你写“我有一个'碰撞'层”时,我假设你在 TilEd 中使用了一个对象层。您可能应该这样做,因为对您的碰撞建模真的很舒服,而且在代码中也很容易使用它。使用您的方法,您将不得不遍历您的切片而不是对象,并自己为碰撞层中的所有切片创建一个矩形。我仍然建议您改用对象层。
    • 会做的,谢谢你的帮助!终于想通了。
    • @Paul 我认为简单的边界框碰撞检查无需担心,即使在移动设备和许多矩形上也是如此。你可以优化它,但你不应该预先优化,只要你没有遇到问题并分析它们的来源。
    • 如果您预计会有很多复杂性,没有什么能阻止您在加载时提取形状然后构建四叉树或类似的东西来加速碰撞搜索
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多