LibGdx 碰撞
LibGdx Collisions
我目前正在使用 LibGdx 开发我的第一个 Android 游戏项目。这是一款 2D 迷宫游戏,您可以使用触摸输入 "draw" 从其中一个入口到其中一个出口的一条线。世界本身是一个 TiledMap,目前仅作为视觉背景。
我遇到的问题是整个碰撞检测系统。迷宫中(很明显)有墙,位于我的背景图块的边缘。所以当我在墙上滑动手指时,"player line" 应该停在墙上。此外,当线路到达出口时应触发事件。
我找不到使用内置库正确实现这些功能的方法(我尝试使用 Scene2D 和 Box2D)。停止 actor 的动作并触发事件并不那么奇怪,或者?
我只需要一些关于我应该使用什么的信息,也许还有一些第一步。 :)
提前致谢!
碰撞检测可能是制作平铺游戏中最困难的部分。 Libgdx 有很多有用的方法可以帮助您 获取几何体 但是检测到碰撞后的实际碰撞处理(称为碰撞解决)是一个很大的话题。我怀疑你想要的只是玩家停下来。更高级的现实解决方案,如弹跳和摩擦,是 Box2D 擅长的。
首先也是最重要的,获取将要发生碰撞的几何体。
a) 玩家可以用矩形表示。让它扩展 Sprite class,然后您可以使用 getBoundingRectangle() 函数(矩形使事情变得简单,但还有许多其他形状可用于碰撞)。
b) 获取瓷砖的几何形状,也是一堆矩形。
获取周围瓦片的函数。
public void getsurroundingTiles(int startX, int startY, int endX, int endY, Array<Rectangle> surroundingTiles){
TiledMapTileLayer layer = (TiledMapTileLayer) worldRef.getCurrentMap().getLayers().get("Terrain");
surroundingTiles.clear();
for (int y = startY; y <= endY; y++) {
for (int x = startX; x <= endX; x++) {
Cell cell = layer.getCell(x, y);
if (cell != null && cell.getTile().getProperties().containsKey("blocked")) {
Rectangle rect = new Rectangle();
rect.set(x, y, 1, 1);
surroundingTiles.add(rect);
}
}
}
}
}
该函数获取在Tiled程序中制作的分块地图分块图层,并且仅当分块具有键"blocked".
时才用矩形填充一个Rectangle ArrayList。
所以现在你有代表你的玩家的矩形,代表所有
碰撞块。您可以使用 ShapeRenderer 对象绘制它们。
这就是我正在开发的游戏中的样子。
最后,实际解决冲突是一个更大的话题。这是一个很好的起点。
http://www.metanetsoftware.com/technique/tutorialA.html
我目前正在使用 LibGdx 开发我的第一个 Android 游戏项目。这是一款 2D 迷宫游戏,您可以使用触摸输入 "draw" 从其中一个入口到其中一个出口的一条线。世界本身是一个 TiledMap,目前仅作为视觉背景。
我遇到的问题是整个碰撞检测系统。迷宫中(很明显)有墙,位于我的背景图块的边缘。所以当我在墙上滑动手指时,"player line" 应该停在墙上。此外,当线路到达出口时应触发事件。
我找不到使用内置库正确实现这些功能的方法(我尝试使用 Scene2D 和 Box2D)。停止 actor 的动作并触发事件并不那么奇怪,或者?
我只需要一些关于我应该使用什么的信息,也许还有一些第一步。 :) 提前致谢!
碰撞检测可能是制作平铺游戏中最困难的部分。 Libgdx 有很多有用的方法可以帮助您 获取几何体 但是检测到碰撞后的实际碰撞处理(称为碰撞解决)是一个很大的话题。我怀疑你想要的只是玩家停下来。更高级的现实解决方案,如弹跳和摩擦,是 Box2D 擅长的。
首先也是最重要的,获取将要发生碰撞的几何体。
a) 玩家可以用矩形表示。让它扩展 Sprite class,然后您可以使用 getBoundingRectangle() 函数(矩形使事情变得简单,但还有许多其他形状可用于碰撞)。
b) 获取瓷砖的几何形状,也是一堆矩形。 获取周围瓦片的函数。
public void getsurroundingTiles(int startX, int startY, int endX, int endY, Array<Rectangle> surroundingTiles){
TiledMapTileLayer layer = (TiledMapTileLayer) worldRef.getCurrentMap().getLayers().get("Terrain");
surroundingTiles.clear();
for (int y = startY; y <= endY; y++) {
for (int x = startX; x <= endX; x++) {
Cell cell = layer.getCell(x, y);
if (cell != null && cell.getTile().getProperties().containsKey("blocked")) {
Rectangle rect = new Rectangle();
rect.set(x, y, 1, 1);
surroundingTiles.add(rect);
}
}
}
}
}
该函数获取在Tiled程序中制作的分块地图分块图层,并且仅当分块具有键"blocked".
时才用矩形填充一个Rectangle ArrayList。所以现在你有代表你的玩家的矩形,代表所有 碰撞块。您可以使用 ShapeRenderer 对象绘制它们。 这就是我正在开发的游戏中的样子。
最后,实际解决冲突是一个更大的话题。这是一个很好的起点。 http://www.metanetsoftware.com/technique/tutorialA.html