Libgdx平铺地图碰撞检测

时间:2014-03-03 17:12:41

标签: java libgdx

我目前正在制作像最终幻想1-4这样的二维RPG游戏。基本上,我的平铺地图可以加载,精灵可以在地图上自由行走。

如何处理平铺地图的碰撞?

我创建了三个单独的图块层。 “背景图层”,“碰撞图层”,“架空图层”,我不确定这是否有用..

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

非常感谢任何帮助。谢谢!

这是我目前的代码

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;
    }
}

3 个答案:

答案 0 :(得分:2)

在我的游戏中,我有一个2D int数组walls[][],其中我存储有关Tiles的信息。对我来说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.

注意:

  1. 这是预先解决,因此先检测碰撞然后再移动。为此,您必须在某处存储碰撞检测的结果。
  2. 角色所在的Tiles由Integerposition.x的{​​{1}}演示文稿定义。
  3. position.y描述了y方向上运动的percntual值。因此,如果你向右走45°,你可以yMovyMov = 0.5。左上角是xMov = 0.5yMov = 0.5
  4. 在此使用此示例代码块并将其复制3次,适用于xMov = -0.5yMov < 0xMov > 0
  5. 此示例中的位置是对象的中间位置。如果在您的情况下它是左下角,您只需要为向上移动添加完整高度,为右移动添加全宽度,为其他移动添加高度/宽度。
  6. 编辑:我尝试更好地解释一下:您的中心点定义了xMov < 0Spriteposition.x和他的身材:{{ 1}},position.y(宽度和高度)。 现在考虑一下,你跑到右边。在这种情况下,您永远不会与左侧的瓷砖碰撞。此外,如果您向右移动,则不能与您上方或下方的瓷砖碰撞。因此,只有1个瓷砖可以检查:右边的瓷砖。如果精灵的正确部分(size.x)移动得很远,你也只能与你右边的瓷砖碰撞。 如果您在y方向的2个瓷砖之间移动,则必须在size.y邮件和position.x + size / 2(position.y + size.y / 2)和newX检查平铺(position.y - size.y / 2)。

    为了让您了解我正在使用的内容:Collision detection。请看第3张图片,其中包含以下描述:

      

    上面的图像为我们提供了2个候选单元格(tile)来检查这些单元格中的对象是否与Bob发生碰撞。

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

    如果您有任何其他问题,请随时提出。

答案 1 :(得分:1)

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

  1. 在Tiled中,将墙砖指定为已阻挡。为此,只需为每个单独的磁贴添加一个名为block的属性。
  2. 在代码中,当您处理播放器移动时,请编写类似此伪代码的内容:

    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;
        }
    
  3. 其中x和y是您要检查的单元格的位置。然后如果阻止= true,则不要移动播放器。如果阻止= false,请移动播放器。

    我可能在这个答案中不清楚,如果是的话,请不要犹豫,给我发消息或查看this awesome tutorial by dermetfan

答案 2 :(得分:0)

我假设您有一个处理运动阶段的方法,如果是这样,我过去的方式就是在注册运动方向后对你的矩形碰撞层进行检查,如果位置是越过其中一个边界然后返回/运行一个方法,但是你想要处理它,即玩家死亡,或者玩家位置不会改变。

相关问题