Android - 根据周围的图块确定图块位图

时间:2012-05-18 20:21:31

标签: android tiles terrain procedural-generation

我一直在研究基于图块的地形生成系统,并且遇到了一些麻烦。我希望创建一系列过渡瓷砖,标记水和土地之间的过渡,并且很难找出一种有效的方法来确定哪个瓷砖应该是哪个。

我的第一次尝试(如下所示)基本上会通过一系列if语句运行每个tile,以确定它应该是哪一个。这个问题的主要问题是,使用100 tile x 100 tile世界地图,它将运行10,000次迭代,访问8个周围区块上的数据(80,000次操作),然后运行最多4个if语句(320,000次)操作)。在我看来,这将是非常低效和缓慢的。

这种方法的优点是它只能在地面砖上运行,并且首先检查以确保它与至少一个水砖相邻,这将大大减少所需操作的数量。

这是我绘制的基本图表,它遍历周围的瓷砖并挑选出适当的瓷砖。

Attempt 1 layout

我的第二个想法是基本上开始穿过瓷砖,一旦我击中沿海瓷砖,沿着两个方向沿着海岸,在我去的时候分配瓷砖。这种方法可以确保在开始之前还没有弄清楚瓷砖。问题在于,一个,我无法弄清楚它是如何工作的,两个,因此我不知道它会有多高效。

一位朋友告诉我第三种方法可行。它需要水瓦片并将它们设置为等于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块一样或更多,效率低下。

所以,在所有这些问题中提出实际问题。有没有人知道这样做的另一种方法,或者使这些方法中的任何一种更有效的方法?

1 个答案:

答案 0 :(得分:0)

我实际上只是编写了我开始研究的游戏的这一部分。我花了一点时间想到解决方案,但是当我这样做时,我简直无法相信我没有想到它。如果您考虑一下,每个磁贴都有8个可能的“连接”:

1 2 3
4 x 5
6 7 8

每个连接都可以包含它连接或不连接的磁贴。所以这很好,它意味着它是一个非常二进制的系统,我们可以用8位(或1个字节)表示每个组合,我们知道每个组合都是从0到255顺序表示,所以我们可以很容易地使用查找表(井) ,查找数组)以找到正确的图像。虽然这确实意味着有256种可能的连接组合(不是256种不同的图像,但就像你上面所说的不同组合将使用相同的图块图形)我们必须生成。我做了(我推荐),写了一个小脚本来生成查找数组。

现在维持这种情况的方法是每个瓷砖都有一个8个长度的瓷砖阵列连接到它。加载地图时,请随时填写切片的“连接”数组。一旦磁贴具有其所有连接(或加载所有磁贴),然后计算每个磁贴的“连接掩码”或“连接值”(这是查找数组的索引)。这是通过循环“连接”数组并使用位移构建掩码来完成的。之后,您应该只需要再次进行非常小的处理,并且只需要添加/删除/更改的单个图块以及连接到的8个可能图块。

希望这会有所帮助。如果您需要更多详细信息或示例代码,我可以稍后提供!