我目前正在制作像最终幻想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;
}
}
答案 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.
注意:
Integer
和position.x
的{{1}}演示文稿定义。position.y
描述了y方向上运动的percntual值。因此,如果你向右走45°,你可以yMov
,yMov = 0.5
。左上角是xMov = 0.5
,yMov = 0.5
。xMov = -0.5
,yMov < 0
,xMov > 0
。 编辑:我尝试更好地解释一下:您的中心点定义了xMov < 0
:Sprite
,position.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)
我真的不建议使用矩形。相反,我在自己的游戏中所做的是:
在代码中,当您处理播放器移动时,请编写类似此伪代码的内容:
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是您要检查的单元格的位置。然后如果阻止= true,则不要移动播放器。如果阻止= false,请移动播放器。
我可能在这个答案中不清楚,如果是的话,请不要犹豫,给我发消息或查看this awesome tutorial by dermetfan。
答案 2 :(得分:0)
我假设您有一个处理运动阶段的方法,如果是这样,我过去的方式就是在注册运动方向后对你的矩形碰撞层进行检查,如果位置是越过其中一个边界然后返回/运行一个方法,但是你想要处理它,即玩家死亡,或者玩家位置不会改变。