我需要某种类型的寻路,所以我搜索了互联网并找到了一些算法。
看起来他们都需要某种类型的地图。 此地图可以表示为:
由于我的地图目前非常庞大(20.000 x 20.000像素),1 x 1 px瓷砖的网格地图将在网格上产生 400.000.000 独特点,也是最佳质量I会想。但这对我来说很重要,所以我可以
由于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
答案 0 :(得分:2)
这需要一些优化,并减少您拥有的节点数量。
几乎所有寻路算法都可以采用不是网格的节点列表。但是,您需要调整节点之间的距离。
您还可以增加网格大小,使其没有那么多的正方形。但是,您需要以某种方式补偿小而窄的路径。
在一天结束时,我建议您通过简单地将节点放置在排列的路径中来减少节点数量,您可以知道可以从A点到B点,指定邻居。但是,您需要为每个级别手动创建节点路径。以我的测试为例(没有墙,只有节点路径):
对于您提供的地图,您最终会得到类似于此的路径节点:
其中有大约50个节点,而网格可以有数百个节点。
这可以在任何比例下工作,因为与网格方法相比,您的节点数量会大大减少。您需要进行一些调整,例如计算节点之间的距离,现在它们不在网格中。对于这个测试,我在Corona SDK(Lua)中使用dijkstra算法,但你可以尝试使用任何其他像A-star(A *),这在许多游戏中使用并且可以更快。
我发现Unity示例采用类似的方法使用节点,您可以看到该方法也适用于3D: