java - Libgdx:用于碰撞的平铺对象层

标签 java android collision-detection libgdx tile

你好,先生们,

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

基本上,我对我的对象层所做的是将我的多段线命名为 Wall,并根据我使用的多段线数量为类型输入数字。以便将来使用时,我可以将此墙编号称为我的碰撞。

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

最佳答案

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

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 进行碰撞检测,请随时与我联系!

关于java - Libgdx:用于碰撞的平铺对象层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17876355/

相关文章:

java - System.getProperty ("line.separator"之间的区别;和 "\n"?

android - Gradle 获取当前包含的文件路径

objective-c - contactTestBitMask 无法检测到联系人?

android - 缩放 View 会减小内容大小但会增加空白边距

java - 安卓工作室模块

java - OpenGL 2D 碰撞检测不起作用

java - 创建一个垂直横向卷轴,在数组列表和逻辑方面遇到问题(Java)

java - super.paintComponent(g) 是做什么的?

java - 迭代所有可用的 Ant 属性

java - Java 中的异常和数组问题