rpgmakermv吧 关注:20,528贴子:66,297

关于rpgmaker随机地图的研究

只看楼主收藏回复


技术贴,研究插件的可以来看一下,伸手党坐等我发插件


IP属地:浙江1楼2018-10-22 22:08回复
    该楼层疑似违规已被系统折叠 查看此楼


    IP属地:浙江2楼2018-10-22 22:10
    回复

      首先在indienova上已经有大佬发了生成地穴的算法,随机出来的效果大致如右图。


      IP属地:浙江3楼2018-10-22 22:13
      回复
        该楼层疑似违规已被系统折叠 查看此楼


        IP属地:浙江4楼2018-10-22 22:19
        回复
          该楼层疑似违规已被系统折叠 查看此楼


          IP属地:浙江5楼2018-10-22 22:22
          回复
            但是,rpgmaker上的地图元素,并不是单纯的就几个编号就能代表的,有许多的图块是可变形的图块。
            举个例子,如果我们用海(id2048)和草地(1536)来做一个地图,我们会发现出来的地图会是这样的:


            IP属地:浙江6楼2018-10-22 22:31
            回复
              这是因为海水其实不是单纯的图块,而是一个可变形的图块,它会根据周围的其他图块情况,做出相应变形,只有周围一圈也都是海水,或者是边界时,才会呈现出正方的海水图块。
              我通过自己编辑测试地图,打印出图块的id,发现这些变形后的图块的id,是在基础id的基础上,再增加变大了一点。
              一个图块的周围一共有8个图块,如果按照这些图块是或者不是海水来分的话,就有2^8=256种情况!!!
              不过应该不会这么多,例如当上下左右都是异种图块时,斜方向上的四个图块无论是不是异种图块,本身图块都是这种自闭的图案


              IP属地:浙江7楼2018-10-22 22:37
              回复
                那么问题来了,变形的图块一共有多少种?
                这是个令人头疼的问题,靠想是很难想出来的。
                于是我用了一个简单的方法。我做了一张空的地图,将第一个图块的id设置成2048,也就是海水的基础id
                然后写一个循环,把后面的图块的id依次变成前者加一。
                也就是说图块1id:2048,图块2id:2049,图块3:2050……
                出来的图是这样的:


                IP属地:浙江8楼2018-10-22 22:40
                回复
                  很明显可以看出,最后一排除了前三个外,其余的都是异种图块了。
                  也就是说,编号2048的海水图块,包括自身在内,一共有48种变种!
                  这个数字也很大,不过比256少很多了。


                  IP属地:浙江9楼2018-10-22 22:41
                  回复
                    为了更直观一点研究,我把宽高变成了8,获得下图:


                    IP属地:浙江10楼2018-10-22 22:42
                    回复
                      这时候,其实已经可以用肉眼看出各种情况下的编号了。
                      图块1:四周都没有异种图块,编号为2048
                      图块2:左上角有异种图块,编号2049
                      ……
                      这种时候,只要不嫌麻烦的话,写一个很长的if else语句,也能根据周围的异种图块,设置自身图块的变形。


                      IP属地:浙江11楼2018-10-22 22:46
                      回复
                        当然了,这个排布一定是有一定规律的,不过在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]]
                        ];


                        IP属地:浙江12楼2018-10-23 11:21
                        回复
                          这个数组有48个元素,和海水图块的48个形状是完全对应的。
                          每个元素是一个数组,里面有四个元素,四个元素是含有两个数字的数组,也就是坐标点。
                          也就是说每个图块有四个坐标点。
                          我们再来看海水图块的原素材图(world_A1 左上就是海水):


                          IP属地:浙江13楼2018-10-23 11:25
                          回复
                            这里发现海水的图案有时三套接连相似的,再加上在rpgmakermv里面,world_A1被标明了是动画:

                            所以这里三套相似的海水其实是个动画,有三帧


                            IP属地:浙江14楼2018-10-23 11:30
                            回复
                              我们只取其中一帧,不难看出,所有图块,都是用这一帧的图切割出来的。
                              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
                              }
                              }


                              IP属地:浙江15楼2018-10-23 12:20
                              回复