当前位置: 华文问答 > 游戏

由unity引擎做的游戏【缺氧】,它的地图的机制是怎么实现的?

2017-07-23游戏

自动图块是指当一个图块放置在地图上之后会自动根据邻接状态调整自身和与其邻接的其它图块,使其与附近的相关图块之间达成连贯的过渡。

如图1所示,同样的一种图块,根据其邻接关系不同,有48种不同的过渡方式。如果靠地图设计师根据邻接状态手动选择图块进行拼接的话,既费时间,也容易出错。因此我们需要在游戏引擎或程序化生成游戏地图(PCG)的过程中引入自动图块算法。

图1. 同样的一种图块,根据其邻接关系不同,有48种不同的过渡方式

我们用0(蓝色海洋)、1(绿色陆地)两种状态来表征一个图块的状态。一种直观的自动图块算法是,对目标位置为1的八邻域按照西北、北、东北、东、东南、南、西南、西的顺时针顺序做编码,然后根据编码的值来确定目标位置显示的过渡图片,如下图所示:

图2. 根据一个图块的八邻域来确定该图块显示什么图像

根据一个图块的8个邻域的图块的状态不同,其实有256(2的8次方)种不同的邻接状态,但在不同的邻接状态下可能选用同一块邻接图片。如图3所示,在0001100和0000100两种编码状态下,中心点邻接的8个邻域状态并不相同,但是中心处采用的是同一张图块素材。 这说明用图块的8个邻接位置进行编码,会引入较多的冗余情况。把冗余的情况去掉,其实每个地图块只需要存48张图片就可以了,即图1中的48种图块。

图3. 这两种情况下,虽然八邻域地图种类不同,但中心位置的图块均为13号图块

如果我们不是存储完整的图块,而是将每个图块拆成左上、右上、左下、右下四份,那么每一个角只需要考虑3邻域,比如下图中的NW角只需要考虑当前块的上、左与左上方向的块即可确定当前角的种类。这样理论上需要存储的图片数量是 2的3次方 乘以 4 个1/4 大小的图块即可,图片容量明显下降。

图4. 将一个地图块进一步拆分成四个部分分别进行绘制再拼合

RPG Maker 编辑器中的自动图块系统,将一个完整的图块划分为4个象限区域,每个象限区域根据各自的三邻域来确定自己由哪个备选角点图案拼成。如下图所示,我们将素材图片划分为20个子区域,其中右上角标注绿色的子区域是图块第一象限(NE)的候选角点图片,左上角标注红色的子区域是图块第二象限(NW)的候选角点图片,左下角标注黄色的子区域是图块第三象限(SW)的候选角点图片,右下角标注蓝色的子区域是图块第四象限(SE)的候选角点图片。

图5. RPG Maker 中使用的 Tile 素材格式

每一个象限的候选图只需要根据该角点相邻的3个邻接区域来确定。例如图块第一象限采用哪个候选图,只需要考虑上、右、右上三个邻接图块的状态。其它三个象限的候选图用同样的方式来确定。

图6. 根据右上角点的上、右、右上三邻域图块的种类与当前图块是否一致,有5种备选图案

假设游戏中每个图块的分辨率为 64 * 64 ,用这种编码方式实现自动图块算法,每种地形的图块集素材的大小仅为 128 * 192,远远小于存储256张或48张地图图块的存储空间。

这个算法来源于1987年 SIGGRAPH 上由 Lorensen 和 Cline 提出的 Marching Cubes (MC) 算法。它的2D版本通常被称为 Marching squares。

图7. Marching squares 原理示意图

我将 RPG Maker 这种基于 Marching squares 的自动图块算法实现后,制作了一个RM地图自动生成工具,可以一键为 RPG Maker MV 与 RPG Maker MZ 编辑器生成地图数据。感兴趣的话可以试一下:https:// huanggaole.github.io/au toRMmap/

这个工具的使用说明:【RMMV】RM地图自动生成在线工具使用说明——自动生成地牢迷宫_哔哩哔哩_bilibili

图7. RM地图自动生成在线工具——自动生成地牢迷宫