Java Libgdx平铺贴图碰撞检测

Java Libgdx平铺贴图碰撞检测,java,libgdx,Java,Libgdx,我目前正在开发一款2d rpg游戏,比如《最终幻想1-4》。基本上,我的平铺地图可以加载,精灵可以在地图上自由行走 如何使用平铺贴图处理碰撞 我已经创建了三个独立的瓷砖层。“背景层”、“碰撞层”、“头顶层”,我不确定这是否有用 编辑:我现在创建了一个对象层,用于在我希望精灵碰撞的区域上与矩形碰撞 非常感谢您的帮助。谢谢大家! 这是我当前的代码 MapObjects collisionObjects = (GameAssets.mainTiledMap).getLayers().get("Coll

我目前正在开发一款2d rpg游戏,比如《最终幻想1-4》。基本上,我的平铺地图可以加载,精灵可以在地图上自由行走

如何使用平铺贴图处理碰撞

我已经创建了三个独立的瓷砖层。“背景层”、“碰撞层”、“头顶层”,我不确定这是否有用

编辑:我现在创建了一个对象层,用于在我希望精灵碰撞的区域上与矩形碰撞

非常感谢您的帮助。谢谢大家!

这是我当前的代码

MapObjects collisionObjects = (GameAssets.mainTiledMap).getLayers().get("CollisionLayer").getObjects();
int tileWidth = 16;
int tileHeight = 16;

for (int i = 0; i < collisionObjects.getCount(); i++) {
    RectangleMapObject obj = (RectangleMapObject) collisionObjects.get(i);
    Rectangle rect = obj.getRectangle();

    rect.set(GamePlayer.x, GamePlayer.y, 16,16);

    Rectangle rectobject = obj.getRectangle();
        rectobject.x /= tileWidth;
        rectobject.y /= tileHeight;
        rectobject.width /= tileWidth;
        rectobject.height /= tileHeight;

    if(rect.overlaps(rectobject)) {
        GamePlayer.ableToMove = false;
    }
}
MapObjects collisionObjects=(GameAssets.mainTiledMap.getLayers().get(“CollisionLayer”).getObjects();
int tileWidth=16;
int-tileHeight=16;
对于(int i=0;i
我假设您有一个处理移动阶段的方法,如果是这样的话,我过去做的方式是,在注册移动方向后,对矩形碰撞层进行检查,如果位置要跨越其中一个边界,则返回/运行一个方法,不管你想如何处理它,即玩家死亡,或者玩家位置不变。

我真的不建议使用矩形。相反,我在自己的游戏中所做的是:

  • 在“平铺”中,将墙平铺指定为已阻止。为此,只需将名为block的属性添加到每个单独的平铺中
  • 在代码中,当处理玩家移动时,编写类似以下伪代码的代码:

    try {
        cell = collisionLayer.getCell((int) (x / collisionLayer.getTileWidth()), (int) (y / collisionLayer.getTileHeight()));
    } catch (Exception e) {
        e.printStackTrace();
    }
    
        if (cell.getTile().getProperties().containsKey("blocked")) {
        blocked = true;
        }
    
  • 其中x和y是要检查的单元格的位置。如果blocked=true,则不要移动玩家。如果blocked=false,移动玩家


    这个答案我可能不清楚,如果我不清楚,请不要犹豫给我发个消息或检查。

    在我的游戏中,我有一个2D int数组
    walls[][]
    ,在那里我存储了有关瓷砖的信息。对我来说,0不是墙,所以我可以穿过。所有其他数字代表一些特殊的墙类型,我必须处理碰撞。要检测是否发生碰撞,我执行以下操作:

    if (yMov > 0) {
        int leftX = (int)(position.x - width/2);    // The leftmost point of the Object.
        int rightX = (int)(position.x + width/2);   // The rightmost point of the Object.
        int newMaxY = (int)((position.y * yMov * currentSpeed * delta) + height/2);
        if (walls[leftX][newMaxY] != 0 || walls[rightX][newMaxY] != 0)
             // Collision in positive y-Direction.
    
    注:

  • 这是预解算,所以先检测碰撞,然后移动。为此,您必须将碰撞检测结果存储在某个位置
  • 字符为的分幅由其
    位置.x
    位置.y
    整数表示定义
  • yMov
    描述y方向运动的感知值。因此,如果向右移动45°,向上就是
    yMov=0.5
    xMov=0.5
    。左上角是
    yMov=0.5
    xMov=-0.5
  • 使用上面的示例代码块并将其复制3次,例如
    yMov<0
    xMov>0
    xMov<0
  • 本例中的位置是对象的中间。如果是左下角,则只需为向上移动添加全高,右移动添加全宽,其他移动不添加高度/宽度
  • 编辑:我试图更好地解释它:你有一个由他的中心点定义的
    精灵:
    位置.x
    位置.y
    和他的大小:
    大小.x
    大小.y
    (宽度和高度)。 现在想想这个案子,你往右边跑。在这种情况下,您永远不会与左侧的瓷砖碰撞。此外,如果要向右移动,则不能与上方或下方的瓷砖碰撞。因此,只需检查1个磁贴:右边的磁贴。此外,如果精灵的右侧部分(
    position.x+size/2
    )移动得太远,则只能与右侧的平铺发生碰撞。 如果您在y方向的两个平铺之间移动,您必须检查
    newX
    位置和
    upperY
    (position.y+size.y/2)和
    lowerY
    (position.y-size.y/2)位置的平铺

    给你一张我正在使用的图片:。看第三张图片,描述如下:

    上图为我们提供了两个候选单元格(平铺),以检查这些单元格中的对象是否与Bob发生碰撞

    这里的碰撞是针对平台制造者的,在那里你有重力,所以你必须检查你下面的瓷砖,原因是。在自上而下的游戏中,情况并非如此。 我并没有完全使用这种方法,但图片显示了我在做什么


    如果您还有其他问题,请随时提问。

    您能再详细说明一下吗?因为当前如果我使用对象层并使用
    if(Intersector.overlaps(矩形,矩形)测试它
    我不确定如何创建可用于表示精灵/纹理区域的矩形。好的,我要做的是确定精灵的大小并创建一个该大小的矩形,然后将该矩形锚定到精灵的位置。然后使用“精灵区域”点击框,检查该区域是否将被覆盖使用任何碰撞层进行ct。或者,您可以检查所有四个角点,查看其中一个角点是否与碰撞层相交,这对于基于平铺的游戏来说是可行的,但是单独为所有四个角点运行if语句需要更大的处理能力,而不是只检查一次总面积。如果我有很多recta在地图上,我是否必须使用
    Rectangle rect=new Rectangle()
    rect.set(x,y,width,height)
    进行碰撞检测?源代码树中的Super Kaolio示例有一些简单的碰撞检测,您可以