Java Libgdx平铺贴图碰撞检测
我目前正在开发一款2d rpg游戏,比如《最终幻想1-4》。基本上,我的平铺地图可以加载,精灵可以在地图上自由行走 如何使用平铺贴图处理碰撞 我已经创建了三个独立的瓷砖层。“背景层”、“碰撞层”、“头顶层”,我不确定这是否有用 编辑:我现在创建了一个对象层,用于在我希望精灵碰撞的区域上与矩形碰撞 非常感谢您的帮助。谢谢大家! 这是我当前的代码Java Libgdx平铺贴图碰撞检测,java,libgdx,Java,Libgdx,我目前正在开发一款2d rpg游戏,比如《最终幻想1-4》。基本上,我的平铺地图可以加载,精灵可以在地图上自由行走 如何使用平铺贴图处理碰撞 我已经创建了三个独立的瓷砖层。“背景层”、“碰撞层”、“头顶层”,我不确定这是否有用 编辑:我现在创建了一个对象层,用于在我希望精灵碰撞的区域上与矩形碰撞 非常感谢您的帮助。谢谢大家! 这是我当前的代码 MapObjects collisionObjects = (GameAssets.mainTiledMap).getLayers().get("Coll
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
我假设您有一个处理移动阶段的方法,如果是这样的话,我过去做的方式是,在注册移动方向后,对矩形碰撞层进行检查,如果位置要跨越其中一个边界,则返回/运行一个方法,不管你想如何处理它,即玩家死亡,或者玩家位置不变。我真的不建议使用矩形。相反,我在自己的游戏中所做的是:
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;
}
这个答案我可能不清楚,如果我不清楚,请不要犹豫给我发个消息或检查。在我的游戏中,我有一个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
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示例有一些简单的碰撞检测,您可以