65.9K
CodeProject 正在变化。 阅读更多。
Home

在瓦片地图编辑器中实现自动瓦片功能

starIconstarIconstarIconstarIconstarIcon

5.00/5 (18投票s)

2010年9月2日

CPOL

4分钟阅读

viewsIcon

168418

本文介绍了一种实现 RPG Maker、星际争霸关卡编辑器等中常见的自动瓦片功能的算法和数据结构。

引言

本文介绍了一种简单的算法和支持数据结构,用于在 RPG Maker 和星际争霸关卡编辑器等基于瓦片的关卡编辑器中实现自动过渡瓦片。当此功能在瓦片地图编辑器中实现时,它能显著加快内容生成速度并确保瓦片使用的一致性。

背景

瓦片式图形(图 1)自视频游戏开发早期以来一直是 2D 游戏的标志,它通过重用相对有限的图形块或瓦片集来呈现大型 2D 环境。由此产生的图形往往显得块状且重复。然而,熟练的图形艺术家可以通过巧妙的设计来缓解这些问题,以打破这种模式。

TileMapExample.png

图 1 - 示例瓦片地图

一种这样的技术是使用过渡瓦片,例如上面插图中的草地-水域和草地-泥土边界。然而,手动正确放置这些过渡瓦片往往是一个繁琐的过程。一个先进的瓦片地图编辑器允许用户标记这些瓦片,使编辑器应用程序能够通过在其周围放置正确的过渡瓦片(例如图 1中的水边)来自动融合新放置的瓦片(例如水)。

自动瓦片组织

大多数自动瓦片集由 14 个瓦片组成,即内部和外部瓦片(例如,纯草地和纯水瓦片)、顶部、底部、左侧和右侧边缘、四个外角和四个内角。本文描述的算法还需要另外两个瓦片,总共 16 个。

该算法将一个瓦片(过渡的或其他的)视为由四个象限组成。每个象限或角可以属于一边(草地)或另一边(水域),相应的边界位于瓦片内。所有可能的角组合产生 2 x 2 x 2 x 2 = 16 种可能的瓦片组合。

这些 16 种组合可以通过组合一个 4 位二进制数 b3 b2 b1 b0 来索引,其中每个位 b i 对应一个角类型。按照惯例,位按照递增的有效性顺序映射到左上角、右上角、左下角和右下角,如图 2所示。

CornerBitFlags.png

图 2 - 角位标志

使用这个 4 位索引,瓦片将按以下顺序排序:

AutoTileSequence.png

图 3 - 按 4 位索引排序的自动瓦片

该过程也可以反转,以便可以从给定的 4 位索引确定角类型。这提供了一种实现下一节所述的自动瓦片功能的方法。为简单起见,假设地图仅由上述 16 个瓦片组成,并且可以直接使用 4 位角索引来引用它们。

自动瓦片算法

  1. 当在地图中放置新瓦片时,将从新瓦片及其 8 个邻居的 4 位索引中提取四个角位。
  2. 对于与新瓦片共享边缘的四个瓦片(左、右、上、下)中的每一个,通过重用新瓦片中最靠近共享边缘的 2 位以及邻近瓦片中最远离边缘的 2 位来构建新的 4 位索引。新的 4 位索引有效地产生了能够与新瓦片正确混合的过渡瓦片。
  3. 类似地,对于与新瓦片共享角的四个剩余邻居(左上角、右上角、左下角、右下角)中的每一个,使用新瓦片中最靠近共享角的位以及邻近瓦片中最远离共享角的 3 位来构建 4 位索引。这些新的 4 位索引同样产生了能够与新瓦片正确混合的四个角邻居。
  4. 邻近瓦片将被替换为对应于新计算出的 4 位索引的新瓦片。

CornerMatch.png

图 4 - 角位索引匹配

考虑因素

除了上述算法之外,还应考虑一些问题:

  • 边缘瓦片

处理地图边缘或角落的瓦片时必须格外小心,因为这些瓦片将比通常的 8 个邻居瓦片少。

  • 瓦片组织

上述算法假设 4 位索引直接对应于瓦片索引。然而,自动瓦片集不一定从索引 0 开始,也不一定连续或按图 3中所述的顺序排列。为了解决这个问题,必须在任意瓦片索引和 4 位角索引之间维护双向映射。

  • Variety(多样性)

尽管使用了平滑过渡的瓦片,但观察者仍然可能因相同的瓦片图案重复出现而感到厌烦,正如在图 1中所见。该算法可以通过将每个 4 位索引映射到多个瓦片变体来改进,并让算法为新放置的瓦片及其邻居随机选择变体。

实现

本文为理论性质,不包含示例源代码。但是,我们邀请读者在开源瓦片地图编辑器tIDE中研究此自动瓦片算法的实现,网址为http://tide.codeplex.com

Animation.gif

图 5 - 自动瓦片动画

历史

  • 2010/9/3 - 草稿版本
  • 2010/9/8 - 小格式问题和澄清
© . All rights reserved.