我正在使用LibGdx对游戏进行编码,并且我有一个阵列,其中包含玩家可以与之碰撞的所有墙对象。对于那些不使用LibGdx的人,我说的是LibGdx的Array类,它提供与ArrayList相同的功能,但它在内存效率的基础上构建。当我检查碰撞时,我不得不穿过阵列中的每个墙并检查碰撞,如下所示:
for(Wall w : walls) {
if(w.bounds().contains(player.bounds()) {
// handle collision
}
}
我意识到这是低效的,因为即使那堵墙不在地图的当前视图中,我也会穿过每一面墙。显然,如果我正在检查相机视口中当前墙壁的碰撞(这意味着玩家当前可以看到它们),那么整个阵列都没有任何意义,因为玩家无法碰撞与他们一起,直到他们进入视野。我只想通过检查与玩家附近墙壁的碰撞来让我的游戏更有效率。在我的游戏中,我将所有墙壁都卡在一个网格上,单元格为32x32像素。我真的不知道如何创建更有效的碰撞搜索。我可以使用某种类型的地图,它使用vector2位置作为其键,然后查看玩家的位置,并在玩家在地图中的位置的某个范围内查看墙壁吗?我真的迷失了如何让代码在我的游戏中无法通过所有100多个墙壁,因为当前只有10个当前可能的墙壁可以触摸玩家。这有意义吗?有人可以解释这样做的好方法吗?非常感谢。
答案 0 :(得分:1)
那里有很多碰撞的alghoritms,你需要找到一个适合你需要的。
我能想到的一个解决方案是: 保持您的墙列表在其坐标上排序。如果您创建了一个新墙,请使用插入排序来求助您的数组。当你想检查碰撞时,取对象坐标(在这种情况下可能是正在运行的玩家)并进行二分查找以找到最接近玩家的墙。然后计算玩家和这堵墙是否发生碰撞。如果最近的墙壁没有造成碰撞,你可以非常自信没有其他墙壁。
答案 1 :(得分:1)
每个墙都在这些32x32px网格中的一个或多个上。设栅格的坐标为x和y。如果网格包含墙,请将其输入
HashMap<CoordPair,Set<Wall>> xy2wall
要调查某个位置与附近墙壁的接触位置,请使用该位置的坐标来确定一小组网格坐标,获取这些CoordPairs映射的一组或多组墙。我猜Player.bounds()可以提供一组合适的坐标。
如果32x32网格导致条目过多,则可以始终使用较粗的网格。
答案 2 :(得分:0)
我曾经在开发自上而下的RPG时也有同样的认识。 在自上而下的RPG中,墙壁比你想象的要多。
以下是我解决它的方法:
首先:将地图划分为区域,即。)在纸上或其他地方绘制地图并将其剪切成部分。
第二:记录地图每个分段部分的像素边界。
第三:检查球员位置相对于边界的位置。
最后:只检查这些边界内的墙壁。
在一个无限的墙壁领域,这不是更有效率(谈论大O),但是出于所有实际目的,这在减少查找时间方面是有效的
if (boundary1.contains(player1)) {
for(Wall w : Boundary1Walls) {
if(w.bounds().contains(player.bounds()) {
// handle collision
}
}
}
else if (boundary2.contains(player1)) {
for (Wall w : Boundary2Walls) {
if(w.bounds().contains(player.bounds()) {
// handle collision
}
}
}
.... 以这种方式继续
请注意......我在上大学进行软件开发之前是这样做的,所以我没有使用BST这样的数据结构,可以用来存储与坐标相关的墙。使您的查询时间非常快。