寻找在巨大的地图上

时间:2016-09-25 15:33:25

标签: lua maps game-physics path-finding a-star

我需要某种类型的寻路,所以我搜索了互联网并找到了一些算法。

看起来他们都需要某种类型的地图。 此地图可以表示为:

  • 网格
  • 节点

由于我的地图目前非常庞大(20.000 x 20.000像素),1 x 1 px瓷砖的网格地图将在网格上产生 400.000.000 独特点,也是最佳质量I会想。但这对我来说很重要,所以我可以

  • 增加磁贴大小(例如50 x 50 px = 160,000个唯一点)
  • 切换到节点

由于160,000个独特点对我来说也很重要,或者我想说,不是我想要的质量,因为有些单位大50 px,我认为节点是更好的方式。

我在互联网2D Nodal Pathfinding without a Grid上找到了这个并进行了一些计算:

local radius = 75                               -- this varies for some units so i stick to the biggest value
local DistanceBetweenNodes = radius * 2         -- to pass tiles diagonaly
local grids = 166                               -- how many col/row
local MapSize = grids * DistanceBetweenNodes    -- around 25.000
local walkable = 0                              -- used later

local Map = {}

function even(a)
    return ((a / radius) % 2 == 0)
end

for x = 0, MapSize, radius do
    Map[x] = {}
    for y = 0, MapSize, radius do
        if (even(x) and even(y)) or (not even(x) and not even(y)) then
            Map[x][y] = walkable
        end
    end
end

在不删除不可通过的节点且单元大小为75的情况下,最终会得到~55445个唯一节点。如果我删除不可通过的节点,节点将大幅缩小,但由于我的单位有不同的大小,我需要将半径变为我得到的最小单位。我不知道这是否会适用于更大的单位。

所以我再次在互联网上搜索了Nav Meshes。 这会将节点减少到我眼中的“几个”,并且可以使用任何单位大小。

更新28.09 我已经创建了一个所有可通过区域的节点映射,现在大约有30.000个节点。

这是一个完全随机的地图示例和我拥有的点数: Example Map

1 个答案:

答案 0 :(得分:2)

这需要一些优化,并减少您拥有的节点数量。

几乎所有寻路算法都可以采用不是网格的节点列表。但是,您需要调整节点之间的距离。

您还可以增加网格大小,使其没有那么多的正方形。但是,您需要以某种方式补偿小而窄的路径。

在一天结束时,我建议您通过简单地将节点放置在排列的路径中来减少节点数量,您可以知道可以从A点到B点,指定邻居。但是,您需要为每个级别手动创建节点路径。以我的测试为例(没有墙,只有节点路径):

enter image description here

对于您提供的地图,您最终会得到类似于此的路径节点:

enter image description here

其中有大约50个节点,而网格可以有数百个节点。

这可以在任何比例下工作,因为与网格方法相比,您的节点数量会大大减少。您需要进行一些调整,例如计算节点之间的距离,现在它们不在网格中。对于这个测试,我在Corona SDK(Lua)中使用dijkstra算法,但你可以尝试使用任何其他像A-star(A *),这在许多游戏中使用并且可以更快。

我发现Unity示例采用类似的方法使用节点,您可以看到该方法也适用于3D:

enter image description here