Libgdx拼接地图碰撞检测



我目前正在开发一款类似《最终幻想1-4》的2d 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;
}
}

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

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

其中x和y是要检查的单元格的位置。然后,如果blocked=true,则不要移动玩家。如果blocked=false,移动玩家。

我可能不清楚这个答案,如果我是,请不要犹豫给我发信息或查看dermetfan的这个很棒的教程。

在我的游戏中,我有一个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. 字符所在的平铺由其position.xposition.yInteger表示形式定义
  3. yMov描述了y方向上运动的感知值。所以,如果你向右45°,向上就是yMov = 0.5xMov = 0.5。左边是yMov = 0.5xMov = -0.5
  4. 使用上面的示例代码块,并将其复制3次,分别用于yMov < 0xMov > 0xMov < 0
  5. 本例中的位置是对象的中间。如果你的情况是左下角,你只需要为向上移动增加全高,为向右移动增加全宽,其他移动不增加高度/宽度

编辑:我试着更好地解释它:你有一个由他的中心点定义的Spriteposition.xposition.y和他的尺寸:size.xsize.y(宽度和高度)。现在想想这个案子,你跑到右边。在这种情况下,您永远不会与左侧的瓷砖发生碰撞。此外,如果向右移动,则不能与上方或下方的瓷砖碰撞。所以只有一个瓷砖需要检查:你右边的瓷砖。此外,如果精灵的右侧部分(position.x + size / 2)移动得足够远,则只能与右侧的平铺碰撞。如果您在y方向的两个磁贴之间移动,则必须检查newX位置的磁贴以及upperY(位置.y+size.y/2)和lowerY(位置.y-size.y/2)。

给你一张我正在使用的图片:碰撞检测。看看第三张图片,上面有这样的描述:

上图为我们提供了两个候选单元格(瓦片),用于检查这些单元格中的对象是否与Bob碰撞。

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

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

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

最新更新