关于rpgmaker随机地图的研究
rpgmakermv吧
全部回复
仅看楼主
level 1
技术贴,研究插件的可以来看一下,伸手党坐等我发插件[滑稽]
2018年10月22日 14点10分 1
level 1
2018年10月22日 14点10分 2
level 1
首先在indienova上已经有大佬发了生成地穴的算法,随机出来的效果大致如右图。
2018年10月22日 14点10分 3
level 1
接着是找到rpgmaker代码里面加载地图数据的地方:
此处$dataMap是整个地图的信息,其中$dataMap.data是地图每个瓦片格的id。
2018年10月22日 14点10分 4
level 1
所以我们要做的就是用代码随机出一套数据来替换$dataMap.data里的数据。
($dataMap.data里的数字个数是地图格子数量的6倍,这意味着rpgmaker里面做了6层分层,目前尚且不知道具体的分层逻辑,所以只在第一层,也就是最前面的一套数字里做处理)
2018年10月22日 14点10分 5
level 1
但是,rpgmaker上的地图元素,并不是单纯的就几个编号就能代表的,有许多的图块是可变形的图块。
举个例子,如果我们用海(id2048)和草地(1536)来做一个地图,我们会发现出来的地图会是这样的:
2018年10月22日 14点10分 6
level 1
这是因为海水其实不是单纯的图块,而是一个可变形的图块,它会根据周围的其他图块情况,做出相应变形,只有周围一圈也都是海水,或者是边界时,才会呈现出正方的海水图块。
我通过自己编辑测试地图,打印出图块的id,发现这些变形后的图块的id,是在基础id的基础上,再增加变大了一点。
一个图块的周围一共有8个图块,如果按照这些图块是或者不是海水来分的话,就有2^8=256种情况!!!
不过应该不会这么多,例如当上下左右都是异种图块时,斜方向上的四个图块无论是不是异种图块,本身图块都是这种自闭的图案
2018年10月22日 14点10分 7
level 1
那么问题来了,变形的图块一共有多少种?
这是个令人头疼的问题,靠想是很难想出来的。
于是我用了一个简单的方法。我做了一张空的地图,将第一个图块的id设置成2048,也就是海水的基础id
然后写一个循环,把后面的图块的id依次变成前者加一。
也就是说图块1id:2048,图块2id:2049,图块3:2050……
出来的图是这样的:
2018年10月22日 14点10分 8
level 1
很明显可以看出,最后一排除了前三个外,其余的都是异种图块了。
也就是说,编号2048的海水图块,包括自身在内,一共有48种变种!
这个数字也很大,不过比256少很多了。
2018年10月22日 14点10分 9
level 1
为了更直观一点研究,我把宽高变成了8,获得下图:
2018年10月22日 14点10分 10
level 1
这时候,其实已经可以用肉眼看出各种情况下的编号了。
图块1:四周都没有异种图块,编号为2048
图块2:左上角有异种图块,编号2049
……
这种时候,只要不嫌麻烦的话,写一个很长的if else语句,也能根据周围的异种图块,设置自身图块的变形。
2018年10月22日 14点10分 11
level 1
当然了,这个排布一定是有一定规律的,不过在rpgmaker的代码文件里找不到。
rpgmaker里面能够看到的只有游戏运行的代码,也就是你如何使用编辑好的数据的内容。
但是对于编辑时,点下一个海水图块后,整个地图数据的处理却并没有。
我在rpg_core里面最后只能找到这个:
Tilemap.FLOOR_AUTOTILE_TABLE = [
[[2,4],[1,4],[2,3],[1,3]],[[2,0],[1,4],[2,3],[1,3]],
[[2,4],[3,0],[2,3],[1,3]],[[2,0],[3,0],[2,3],[1,3]],
[[2,4],[1,4],[2,3],[3,1]],[[2,0],[1,4],[2,3],[3,1]],
[[2,4],[3,0],[2,3],[3,1]],[[2,0],[3,0],[2,3],[3,1]],
[[2,4],[1,4],[2,1],[1,3]],[[2,0],[1,4],[2,1],[1,3]],
[[2,4],[3,0],[2,1],[1,3]],[[2,0],[3,0],[2,1],[1,3]],
[[2,4],[1,4],[2,1],[3,1]],[[2,0],[1,4],[2,1],[3,1]],
[[2,4],[3,0],[2,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],
[[0,4],[1,4],[0,3],[1,3]],[[0,4],[3,0],[0,3],[1,3]],
[[0,4],[1,4],[0,3],[3,1]],[[0,4],[3,0],[0,3],[3,1]],
[[2,2],[1,2],[2,3],[1,3]],[[2,2],[1,2],[2,3],[3,1]],
[[2,2],[1,2],[2,1],[1,3]],[[2,2],[1,2],[2,1],[3,1]],
[[2,4],[3,4],[2,3],[3,3]],[[2,4],[3,4],[2,1],[3,3]],
[[2,0],[3,4],[2,3],[3,3]],[[2,0],[3,4],[2,1],[3,3]],
[[2,4],[1,4],[2,5],[1,5]],[[2,0],[1,4],[2,5],[1,5]],
[[2,4],[3,0],[2,5],[1,5]],[[2,0],[3,0],[2,5],[1,5]],
[[0,4],[3,4],[0,3],[3,3]],[[2,2],[1,2],[2,5],[1,5]],
[[0,2],[1,2],[0,3],[1,3]],[[0,2],[1,2],[0,3],[3,1]],
[[2,2],[3,2],[2,3],[3,3]],[[2,2],[3,2],[2,1],[3,3]],
[[2,4],[3,4],[2,5],[3,5]],[[2,0],[3,4],[2,5],[3,5]],
[[0,4],[1,4],[0,5],[1,5]],[[0,4],[3,0],[0,5],[1,5]],
[[0,2],[3,2],[0,3],[3,3]],[[0,2],[1,2],[0,5],[1,5]],
[[0,4],[3,4],[0,5],[3,5]],[[2,2],[3,2],[2,5],[3,5]],
[[0,2],[3,2],[0,5],[3,5]],[[0,0],[1,0],[0,1],[1,1]]
];
2018年10月23日 03点10分 12
level 1
这个数组有48个元素,和海水图块的48个形状是完全对应的。
每个元素是一个数组,里面有四个元素,四个元素是含有两个数字的数组,也就是坐标点。
也就是说每个图块有四个坐标点。
我们再来看海水图块的原素材图(world_A1 左上就是海水):
2018年10月23日 03点10分 13
level 1
这里发现海水的图案有时三套接连相似的,再加上在rpgmakermv里面,world_A1被标明了是动画:
所以这里三套相似的海水其实是个动画,有三帧
2018年10月23日 03点10分 14
level 1
我们只取其中一帧,不难看出,所有图块,都是用这一帧的图切割出来的。
Tilemap.FLOOR_AUTOTILE_TABLE里面的数据就是一个对应的切割参数。
当然了,这是对于地图数据的使用,对我们如何生成随机地图没有帮助。
我们要编辑地图,需要的是如何在已知基本id的情况下,如何更具周围异种图块的情况,修改id。
让我们重新来看那张图,这次,只看前两排:
很明显,前两排图块都是上下左右没有异种图块,只有斜方向有异种图块的情况。
然后,第一个图块是基础id2048的图块
第二个图块是左上角有异种图块,id2049 = 2048 + 1
第三个图块右上角有异种图块,id2050 = 2048 + 2
第四个图块左上角和右上角有异种图块,id2051 = 2048 + 3 = 2048 + 1 + 2
第五 2052 = 2048 + 4
2048 + 1 + 4
2048 + 2 + 4
……
这个时候,如果你熟悉计算机,熟悉编程,应该能领悟到,这是一个二进制!!!!!!!
斜方向有四个点,每个点有异种/同种两种情况
如果要用数字不重复地表示出这所有情况,很简单,用一个四位的二进制数表示,每个点是二进制数上的一位!
当然也可以换成十进制的规则:
如果左上角有异种图块,id+1
右上角id+2
右下角id+4
左下角id+8
写成代码就是这样子:
if (!left && !up && !down && !right) {
if (leftUp) {
tmp+=1
}
if (rightUp) {
tmp+=2
}
if (rightDown) {
tmp+=4
}
if (leftDown) {
tmp+=8
}
}
2018年10月23日 04点10分 15
1 2 尾页