Java更高效的数组搜索

时间:2014-12-31 14:37:59

标签: java arrays sorting libgdx

我正在使用LibGdx对游戏进行编码,并且我有一个阵列,其中包含玩家可以与之碰撞的所有墙对象。对于那些不使用LibGdx的人,我说的是LibGdx的Array类,它提供与ArrayList相同的功能,但它在内存效率的基础上构建。当我检查碰撞时,我不得不穿过阵列中的每个墙并检查碰撞,如下所示:

for(Wall  w : walls) {
    if(w.bounds().contains(player.bounds()) {
    // handle collision
    }
}

我意识到这是低效的,因为即使那堵墙不在地图的当前视图中,我也会穿过每一面墙。显然,如果我正在检查相机视口中当前墙壁的碰撞(这意味着玩家当前可以看到它们),那么整个阵列都没有任何意义,因为玩家无法碰撞与他们一起,直到他们进入视野。我只想通过检查与玩家附近墙壁的碰撞来让我的游戏更有效率。在我的游戏中,我将所有墙壁都卡在一个网格上,单元格为32x32像素。我真的不知道如何创建更有效的碰撞搜索。我可以使用某种类型的地图,它使用vector2位置作为其键,然后查看玩家的位置,并在玩家在地图中的位置的某个范围内查看墙壁吗?我真的迷失了如何让代码在我的游戏中无法通过所有100多个墙壁,因为当前只有10个当前可能的墙壁可以触摸玩家。这有意义吗?有人可以解释这样做的好方法吗?非常感谢。

3 个答案:

答案 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这样的数据结构,可以用来存储与坐标相关的墙。使您的查询时间非常快。