撰写了文章 更新于 2019-09-18 11:07:31
rpgmkaermv地图、图块详解
封面是我正在制作的一款游戏,断断续续几个月时间,终于迎来一个需要解决的重要问题:随机地图的生成。由于这款游戏是一款迷宫游戏,游戏的中间形态类似于不可思议的迷宫,所以我需要的随机地图是指:在一个大地图中随机生成若干个房间。
以上需求的关键是两个部分,一个是生成随机房间的算法,另一个rpgmakermv的地图绘制。由于这几年roguelke的兴起,随机地图的生成算法很容易找到。我参考的随机地图算法在这里:https://zhuanlan.zhihu.com/p/30724817 这个算法的思路在此不再赘述。
接下来的事情就是就是rmmv地图的绘制了。
地图绘制的大体原理一般是这样,在编辑器里给每个图块分配一个索引(图块ID),根据每个图块的ID把相应的一个大图的某个图块绘制在屏幕上。
这里的问题是:rmmv是如何给每个图块分配索引的?
先介绍下几个关键的概念:
$dataMap 这个json对象保存的是当前地图数据和信息。具体内容可以用文本编辑器打开。在mv编辑器,地图设置的内容会保存在这里。$dataMap在SceneMap的create()函数中会根据mapID进行读取。在执行传送事件后,create函数将会执行。
$dataMap中的一项重要的信息是data。data是一个数组,它的值是图块的ID,它的长度=地图长*地图宽*6。即它的长度为地图面积的六倍。从这里也可以看出mv的地图时分层的,共分为6层。
接下来是图块ID的分配。代表每个图块的ID是如何计算的。
我们知道每个地图的的素材文件是由若干个48*48像素大小的图块拼起来的。每张地图的图块必然对应一个独一无二的ID。这些ID如何分配呢?
图上的代码右边的数字表示的就是每张图块tileID的起始位置。
但是仅仅了解这些是不够的。前面说过mv的地图共分为六层。分层的意义在于在绘制地图时,先绘制低图层的图块,再绘制高图层的图块(这个结论是我的推测,目前对这段代码理解还不够。之所以说是推测是因为:从$dataMap中的每个tileId来看,图块所在的图层是在编辑时就确定的。既然在编辑时确定,就没有必要在绘制时确定图层的高低。这一部分还有待深入探究)
如何计算自动元件的tileId?
在core.js文件Tilemap中,有根据tileId计算当前图块的种类和形状的方法。
所谓图块的种类,即在mv编辑器中,从每个图块的左上角依次向右边数,第一个图块的种类即为0,第二个图块种类为1,依次类推。
图块形状稍微有点抽象,总计48种,描述了自动元件在地图拼接的48种情况。网上有不少文章讲解这48种拼接情况,建议自行搜索关键字:rpmaker自动元件拼接原理。