【译】在tile地图编辑器实现自动拼接功能

发表于2016-02-21
评论3 7.6k浏览

原文地址:http://www.codeproject.com/Articles/106884/Implementing-Auto-tiling-Functionality-in-a-Tile-M#_comments

版权:作者版权声明为http://www.codeproject.com/info/cpol10.aspx,可以翻译


介绍

  这篇文章提供了一个诸如RPG Maker、星际争霸关卡编辑器的自动拼接功能的算法和数据结构。当地图编辑器提供了这个功能,能显著加快内容创建的节奏。


背景

  基于tile的图像现在已经是2d游戏的标志了,因为早期的2D游戏使用有限的tile来表现一个大的2D环境。这很自然地会让图像块状并且重复。但是,高超的图像艺术家会通过巧妙地设计来避免这些问题。

  一个类似的技术需要使用供过渡的tile,比如草地-水,草地-荒漠等如上图所示的块。但是,把这些过渡块手工放置在合适的位置工作量非常大。一个复杂的地图编辑器会允许用户标记哪些块,然后自动混合。


自动拼接

  大部分自动拼接几何包括14个块,包括内部块和外部块(比如全部是草地和全是水的)、上、下、左、右边界、四个外角以及四个内角。这里的算法还要两个额外的块一共16个。

这个算法认为一个块是由四象限构成的。每一个象限或者角都属于一方(水或者草地)。所有可能的组合共有2 x 2 x 2 x 2 = 16

  这16种组合可用4位的2进制数字b3 b2 b1 b0  来表示。每一位b I 对应一个角的类型。如下图所示,分别对应左上、左下、右上和右下。

  使用4位索引,可以按如下排序:

  这个过程也可以反过来,用4位序列来决定角的类型。这在下一节中给出了一个算法。为简便起见,假设地图只有这16种情况,并可用4位序列索引。


自动拼接算法

  当一个新的tile被放置到地图中的时候,可以从它8个邻居的情况来推断它对应的是哪个4位索引

2.     对于4个与新tile共享一条边的4tile(上下左右),新的4位索引被构建,2位来自新的tile2位来自与共享边离得远的tile。新的4位索引会有限的让这tile进行过渡

3.     类似的算法也发生在剩下4个块(左上,左下,右上,右下)。

4.     与新块临近的块都已经计算了新的4位索引。


进一步考虑

  除了上面的算法,还有以下问题需要考虑


·    边缘块

   必须小心处理边缘或者角落的地图,因为他们的周围经常少于8


·   Tile组织

   上面的算法假设4位索引直接对应tile索引。如果不是这样或者索引不连续,就需要建立一个图片和4位索引之间的双向查找。


·   变种

   尽管这样过渡比较光滑了,但是观察者还是能看到重复的图样,可以把一个4位索引对应多个图片来解决这个问题。


实现

  这篇文章没有理论没有包括任何示例代码,但是读者可以从这个开源地图编辑器tIDE(http://tide.codeplex.com)来研究这个自动拼接算法。



如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引