【问题标题】:Android - Determine tile bitmap based on surrounding tilesAndroid - 根据周围的瓷砖确定瓷砖位图
【发布时间】:2012-05-26 09:59:34
【问题描述】:

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

我的第一次尝试(如下图所示)基本上会通过一系列 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 块一样,甚至更多效率低下。

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

【问题讨论】:

  • 您是否尝试过任一解决方案并测试过它的速度?您确定您没有尝试过早优化吗?
  • 还没有,我还没有机会。我正在寻找一种替代方法,假设运行所有这些 if 语句将非常耗时。今晚我将通过第一种方法。
  • @Zathross 好吧,看起来你是对的。我通过初始测试和总返回时间运行它,通过地图上的每个方格,收集周围瓷砖的信息,检查水,然后分配正确的位图,平均需要 60 毫秒。然而,当我在游戏中看到它时,我意识到我离考虑所有可能的陆地-水域配置还差得很远。我可能会将所需的瓷砖数量增加一倍或三倍,这可能会导致我再次尝试使用第三种方法。

标签: android tiles terrain procedural-generation


【解决方案1】:

实际上,我只是写了我开始制作的游戏的这一部分。我花了一点时间来思考解决方案,但当我这样做时,我不敢相信我没有早点想到它。如果您考虑一下,每个图块都有 8 个可能的“连接”:

1 2 3
4 x 5
6 7 8

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

现在维护这一点的方法是每个图块都有一个长度为 8 的图块数组。加载地图时,边走边填写图块的“连接”数组。一旦一个 tile 拥有所有连接(或一旦加载了所有 tile),然后计算每个 tile 的“连接掩码”或“连接值”(这是查找数组的索引)。这是通过循环“连接”数组并使用位移构建掩码来完成的。之后,您应该只需要再次进行非常少的处理,并且只需要对添加/删除/更改的单个图块及其连接的 8 个可能的图块进行处理。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多