我一直在研究基于图块的地形生成系统,但遇到了一些障碍。我希望创建一系列过渡瓷砖来标记水和陆地之间的过渡,并且无法找出一种有效的方法来确定哪个瓷砖应该是哪个瓷砖。
我的第一次尝试(如下图所示)基本上将通过一系列 if 语句运行每个图块,以确定它应该是哪个图块。这样做的主要问题是,对于 100 块 x 100 块的世界地图,它将运行 10,000 次迭代,访问 8 个周围块上的数据(80,000 次操作),然后运行多达四个 if 语句(320,000操作)。在我看来,这将是非常低效和缓慢的。
这种方法的好处是它只能在陆地单元格上运行,并且会首先检查以确保它与至少一个水单元格相邻,这将大大减少所需的操作次数。
这是我绘制的基本图表,它遍历周围的瓷砖并挑选出合适的瓷砖。
我的第二个想法是基本上开始穿过瓷砖,一旦我碰到沿海瓷砖,就沿着两个方向沿着海岸走,边走边分配瓷砖。此方法将确保在开始之前尚未计算出图块。这样做的问题是,一,我无法弄清楚它是如何工作的,二,结果我不知道它的效率有多高。
一位朋友告诉我第三种可能有效的方法。它获取水瓷砖并将它们设置为 0,将它们设置为 1。然后,它获取周围的瓷砖并将它们从 1 到 9 编号。从那里遍历它们并在 0 和 1 上创建一个字符串:
W W W
W L L
L L L
将是:000011111
0*2^0 + 0*2^1 + 0*2^2 + 0*2^3 + 1*2^4 + 1*2^5 + 1*2^6 + 1*2^7 + 1* 2^8
0*1 + 0*2 + 0*4 + 0*8 + 1*16 + 1*32 + 1*64 + 1*128 + 1*126 = 496
理论上,我会为与该组合关联的图块分配数字 496 并加载它作为响应。问题是每条边都有 13 或 14 种组合,这会导致它的使用。例如:
W W L L W W
W L L and W L L Both need the same tile as the above example, but
L L L L L L produce different numbers.
从本质上讲,要使这种方法起作用,我必须找出会导致特定瓷砖的每种可能的水和土地组合的最终数字,然后通过一系列 ifs / case 运行最终数字以挑选出适当的位图。这将与 if 块一样或更多低效。
因此,在所有这一切中提出实际问题。有谁知道这样做的另一种方法,或者使这些方法中的任何一种更有效的方法?