lua - 在巨大的 map 上寻路

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

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

似乎他们都需要某种类型的 map 。 该 map 可以表示为:

  • 网格
  • 节点

由于我的 map 目前相当大(20.000 x 20.000 像素),1 x 1 像素图 block 的网格 map 将导致网格上400.000.000 个独特的点,并且也是我最好的质量会想。但这对我来说意义重大,所以我可以

  • 增加图 block 大小(例如 50 x 50 像素 = 160.000 个唯一点)
  • 切换到节点

由于 160.000 个独特点对我来说也太多了,或者我想说,这不是我想要的质量,因为有些单位更大到 50 像素,我认为节点是更好的选择。

我在互联网上找到了这个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 我已经创建了所有可通行区域的节点 map ,现在约有 30.000 个节点。

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

最佳答案

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

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

您还可以增加网格大小,使其没有那么多的方 block 。不过,您需要以某种方式补偿又小又窄的路径。

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

enter image description here

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

enter image description here

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

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

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

enter image description here

关于lua - 在巨大的 map 上寻路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39688630/

相关文章:

javascript - 更新标记簇

java - 填充已实例化的 map

javascript - 为什么球会穿过砖 block ?

c++ - 为嵌入式 Lua 设置超时

pointers - Lua表->地址和地址->表

lua - 使用 "array style"表是否比使用 "map style"表提供更快的读取访问?

c++ - 有什么方法可以在 C/C++ 中以编程方式确定 Lua 函数需要多少个参数?

r - 在 R map 中包含比例和坐标

c++ - 计算刚体惯性张量世界坐标

java - 如何在Java中制作一个实心矩形?