Lua 巨大地图上的寻路

Lua 巨大地图上的寻路,lua,maps,game-physics,path-finding,a-star,Lua,Maps,Game Physics,Path Finding,A Star,我需要某种类型的寻路,所以我搜索了互联网,找到了一些算法 似乎他们也都需要某种类型的地图。 此地图可以表示为: 网格 节点 由于我的地图目前相当大(20.000 x 20.000 px),1 x 1 px分片的网格地图将在网格上产生400.000.000独特的点,也是我认为最好的质量。但这对我来说意义重大,所以我也可以 增加瓷砖尺寸(例如,50 x 50 px=160.000个唯一点) 切换到节点 由于160000个独特的点对我来说也太多了,或者我会说,不是我想要的质量,因为有些单元更大

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

似乎他们也都需要某种类型的地图。 此地图可以表示为:

  • 网格
  • 节点
由于我的地图目前相当大(20.000 x 20.000 px),1 x 1 px分片的网格地图将在网格上产生400.000.000独特的点,也是我认为最好的质量。但这对我来说意义重大,所以我也可以

  • 增加瓷砖尺寸(例如,50 x 50 px=160.000个唯一点)
  • 切换到节点
由于160000个独特的点对我来说也太多了,或者我会说,不是我想要的质量,因为有些单元更大,比如50px,我认为节点是更好的方式

我在互联网上找到了这个,并做了一些计算:

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个唯一节点。如果删除不可访问的节点,节点将急剧缩小,但由于我的单位大小不同,我需要将半径设置为我得到的最小单位。我不知道这是否会在以后更大的单位工作

所以我又在网上搜索了一遍,找到了这个。 在我看来,这将把节点减少到“几个”,并且可以处理任何单位大小的节点

更新28.09 我已经创建了所有可通行区域的节点图,现在约有30000个节点

这是一个完全随机的地图示例和我的点:

这需要进行一些优化,并减少节点数量

几乎任何寻路算法都可以采用非网格的节点列表。不过,您需要调整节点之间的距离

您还可以增加网格大小,这样它就不会有那么多的正方形。不过,您需要以某种方式补偿狭小的道路

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

对于提供的地图,您将得到一个类似于以下内容的路径节点:

它有大约50个节点,而网格可以有数百个节点

这可以在任何规模上工作,因为与网格方法相比,节点数量显著减少。现在节点不在网格中,您需要进行一些调整,例如计算节点之间的距离。在这个测试中,我使用了Corona SDK(Lua)中的dijkstra算法,但您可以尝试使用任何其他算法,比如A-star(A*),它在许多游戏中都使用,而且速度更快

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


我在我的帖子中添加了一个例子来说明我的观点。我刚刚看到了这一点,并计算了我需要多少节点:这似乎是另一个好方法。您可以将网格变小,以减少节点数。是的,与具有400.000.000节点的1px版本相比,这将产生:(25.000/unit.width*2)*(25.000/unit.width*2),而例如unit.width~75====>约30.000个节点。我只需要看看我是如何把它们变成钻石形状的。为什么不试试网格的方式,只是把你的网格变小,就像每个网格都是20像素一样?第一篇文章更新了。