[英]Java more efficient array searching
我正在使用LibGdx对游戏进行编码,我有一个数组,其中包含玩家可以碰撞的所有墙对象。 对于那些不使用LibGdx的人,我说的是LibGdx的Array类,它提供了与ArrayList相同的功能,但它的构建考虑了内存效率。 当我检查碰撞时,我不得不穿过阵列中的每个墙并检查碰撞,如下所示:
for(Wall w : walls) {
if(w.bounds().contains(player.bounds()) {
// handle collision
}
}
我意识到这是低效的,因为即使那堵墙离开了地图的当前视图,我也会穿过每一面墙。 显然,如果我正在检查相机视口中当前墙壁的碰撞(这意味着玩家当前可以看到它们),那么通过整个阵列是没有意义的,因为玩家在进入之前不能与它们发生碰撞视图。 我只想通过检查与玩家附近墙壁的碰撞来让我的游戏更有效率。 在我的游戏中,我将所有墙壁都卡在一个网格上,单元格为32x32像素。 我真的不知道如何创建更有效的碰撞搜索。 我可以使用某种类型的地图,它使用vector2位置作为其键,然后查看玩家的位置并在玩家在地图中的位置的某个范围内查看墙壁吗? 我真的迷失了如何在我的游戏中拥有不会通过所有100多个墙壁的代码,因为当前只有10个当前可能的墙壁可以触摸玩家。 这有道理吗? 有人可以解释这样做的好方法吗? 非常感谢。
那里有很多碰撞的alghoritms,你需要找到一个适合你需要的。
我能想到的一个解决方案是:
保持您的墙列表在其坐标上排序。 如果您创建了一个新墙,请使用插入排序来求助您的数组。 当你想检查碰撞时,取对象坐标(在这种情况下可能是正在运行的玩家)并进行二分查找以找到最接近玩家的墙。 然后计算玩家和这堵墙是否发生碰撞。 如果最近的墙没有造成碰撞,你可以非常自信没有其他墙也是如此。
每个墙都在这些32x32px网格中的一个或多个上。 设栅格的坐标为x和y。 如果网格包含墙,请将其输入a
HashMap<CoordPair,Set<Wall>> xy2wall
要调查位置与附近墙壁的接触位置,请使用位置坐标确定一小组网格坐标,获取由这些CoordPairs映射的一组或多组墙。 我猜Player.bounds()可以提供一组合适的坐标。
如果32x32网格导致过多条目,则始终可以使用较粗糙的网格。
在开发自上而下的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这样的数据结构,可以用来存储与坐标相关的墙。 使您的查询时间非常快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.