gamemaker吧 关注:13,603贴子:94,721
  • 19回复贴,共1

【萌新向-图文】浅谈简易存档实现

只看楼主收藏回复

前几天一直在研究存档功能,本来打算使用自带的f5f6的,但是为了省内存使用了外载资源,而自带的存档只会保存最基础的数据(变量和实例),因此在豆姐的帮助下进行了开荒,另外这里也推荐下一个大佬的博客,是目前见到过最精致的gm8辅助了(一楼防吞)


IP属地:吉林1楼2024-04-06 11:23回复
    参考博客:(原链接做了访问保护,因此这里给出github后缀):/NichtsHsu/gm8_tutorial


    IP属地:吉林3楼2024-04-06 11:32
    回复
      本教程只作为最萌新的讲解,考虑到各方面最基础的数据存放可能,本人实力也有限,所以不过多深入


      IP属地:吉林4楼2024-04-06 11:33
      回复
        首先我们需要了解gm的数据结构,打开f1,哇嘞好多结构,学不会啊怎么办,没关系,我们在这里只学习最简单的map和ini,分别对应简单的二进制加密和完全不加密的数据


        IP属地:吉林5楼2024-04-06 11:35
        回复
          首先我们来了解一下map(配对),这是一种一一对应的结构(当然,ini也是),咱们这里引用NichtsHsu大佬的例子,,可以看出,我们仍然是需要进行一个文件的读写,先打开dat文档(没有会自动生成),然后创建一个map结构,注意喔,map实际上是类似于数组或者变量一样的东西,他本质是这个obj的本地单位,因此使用with时千万注意,之后的任务就非常简单了,使用ds_map_add函数,分别填入map名字、键、数值就好,这个键就可以理解为花名册上的年级姓名,作为一个配对的标准,你的名字叫小明,那么我之后只需要搜索名字这个键就可以得到小明这个字符串了。
          当然,在操作完成之后要记得关闭map和dat文件(先后顺序),之后打开这个dat,你会发现我们得到了一个天书
          ,看不懂?看不懂就对了,这是计算机二进制加密后的结果,反正她能看懂就行


          IP属地:吉林6楼2024-04-06 11:45
          回复
            打开f1,我们发现读取也挺简单,这里不多赘述,直接引用NichtsHsu大佬的例子,谁看谁明白


            IP属地:吉林7楼2024-04-06 11:47
            回复
              你会发现,文件的读写似乎并不是难事,真正的难点在于怎么实现,不过别着急,咱们先把ini讲完
              ini可以理解为一种更牛逼的txt文件,当然这个暴论会引起大佬们的血压飙升,实际上,ini也可以用电脑自带的记事本来写,这里引用小太的介绍(吧内搜索ini就能看见

              哇!那这么牛逼的文件结构到底该怎么实现呢,我们先来看我的一个例子


              IP属地:吉林8楼2024-04-06 11:52
              回复

                在这个例子中,我们使用了两个obj,gm用来控制存档读档,object0用来标识。
                读一读代码(只看下方没被注释的),很容易明白框架逻辑,打开ini,ini_write_(real/string)写入数据,关闭ini,如出一辙的方式,我们随便放几个object0,得到了这个ini(由于gm8设计缺陷,ini只能放在同一目录下,可以用苞米的插件修改(链接失效了我也没找着,实在需要请联系玉米然后发我一份))

                其中,endless是我们的section,用来引领全文,举个栗子,我在做的是类植物大战僵尸游戏,那么我就可以在endless结构下存放无尽模式的数据,在normal结构下存放冒险模式的,而结构下面则是类似于配对的东西,一一对应且很方便代码修改删除,ini的好处就是非常非常直观,调试的时候很方便看出错误,矛盾点在于他是明文数据,玩家很容易就修改了,但我很喜欢这一点,对于gm的小游戏来说,修改和破解也挺有意思的,激起了玩家的探索心(?)


                IP属地:吉林9楼2024-04-06 12:02
                回复
                  吃个饭,回来更,今天我要吃卤肉饭


                  IP属地:吉林10楼2024-04-06 12:04
                  回复
                    支持分享


                    IP属地:广东11楼2024-04-06 20:07
                    回复
                      已收录至精华帖分类:研究记录
                      嘛,不过从咱的角度来说,更推荐新人用的是数组(方括号直接访问)+ini。数据结构方面跨过map是因为map会产生一串难以人力读取的字串,至少萌新读起来很吃力(不过8楼的文件内容,似乎没用到map结构的样子)。ini确实是最方面易学的文件结构,不过一般只用来存储固定数量的配置信息,一般endless这种可能有不定数量的数据要存时不太理想。如果有余力和合适的工具,还是建议试试文本文件/二进制文件的。能拿二进制存文件的话,以后转到S2时几乎可以无缝流畅过渡到buffer直存直读,超级丝滑流畅。


                      IP属地:北京12楼2024-04-07 15:50
                      收起回复
                        在这里我们仔细讲一讲ini,这种简明直观的数据结构很适合新手学习调试,在这个例子中,我们使用了ini_open()打开/新建了同路径下的ini文件,使用ini_write_string(real)来写入字符串(或真值),在粉色的框中,我们使用该obj(saving-gm)来遍历了目标obj(友方单位),for循环会使该循环不重复地执行n次(n等于友方单位数目),每一次进入for循环,我们使用with来处理instance_find(obj,id)获得一个友方单位,使用for中的i来保证不重复。进入with结构后,我们相当于在该友方单位中写代码(我们称为小明i号),因此在调用变量时,千万注意区分本地变量和全局变量,比如图中的saving_gm.i,使用了with后,saving_gm的i这个变量就是不存在于小明1号中的了
                        另外,如果你遇到了任何读取或者写入失败的情况,请检查你的全部参数,不管是路径、键、结构名,她们全部都必须是字符串,也就是 “这个形式” !!!同样,因为是字符串,我们可以使用“+”、“string()”等来将他于我们的游戏变量进行拼接来区分


                        IP属地:吉林13楼2024-04-07 18:59
                        回复
                          然后同理,我们逆向写入读取函数,并用循环让她把独到的数据生成出来(这里使用了object_index来获得对象的索引,以此作为obj生成的依据,注意如果这个值是0的话可能会出现巧合性bug)


                          IP属地:吉林14楼2024-04-07 19:02
                          回复

                            接下来我们打开生成的ini文件,,呱啊!真是简洁直观口牙每一个数据都看得清清楚楚(,这样一来,不仅自己可以很方便直观地调试,玩家打不过也可以自己来改数据,省去了风灵月影的麻烦(?),如果需要的话,对于这种外置数据的处理,你大可以自己用python或者干脆用gm就能做一个外置修改器,原理也就是反向的修改和读取一次,也是非常简单的


                            IP属地:吉林15楼2024-04-07 19:15
                            回复
                              虽然没看懂,但是感觉好像可以用于制作地图编辑器,回头学习一下,谢谢


                              IP属地:天津来自手机贴吧16楼2024-04-10 15:57
                              收起回复