【萌新向-图文】浅谈简易存档实现
gamemaker吧
全部回复
仅看楼主
level 9
Acilen- 楼主
前几天一直在研究存档功能,本来打算使用自带的f5f6的,但是为了省内存使用了外载资源,而自带的存档只会保存最基础的数据(变量和实例),因此在豆姐的帮助下进行了开荒,另外这里也推荐下一个大佬的博客,是目前见到过最精致的gm8辅助了(一楼防吞)
2024年04月06日 03点04分 1
level 9
Acilen- 楼主
参考博客:(原链接做了访问保护,因此这里给出github后缀):/NichtsHsu/gm8_tutorial
2024年04月06日 03点04分 3
level 9
Acilen- 楼主
本教程只作为最萌新的讲解,考虑到各方面最基础的数据存放可能,本人实力也有限,所以不过多深入[乖]
2024年04月06日 03点04分 4
level 9
Acilen- 楼主
首先我们需要了解gm的数据结构,打开f1
,哇嘞好多结构,学不会啊怎么办,没关系,我们在这里只学习最简单的map和ini,分别对应简单的二进制加密和完全不加密的数据[滑稽][玫瑰]
2024年04月06日 03点04分 5
level 9
Acilen- 楼主
首先我们来了解一下map(配对),这是一种一一对应的结构(当然,ini也是[滑稽]),咱们这里引用NichtsHsu大佬的例子,
,可以看出,我们仍然是需要进行一个文件的读写,先打开dat文档(没有会自动生成),然后创建一个map结构,注意喔,map实际上是类似于数组或者变量一样的东西,他本质是这个obj的本地单位,因此使用with时千万注意,之后的任务就非常简单了,使用ds_map_add函数,分别填入map名字、键、数值就好,这个键就可以理解为花名册上的年级姓名,作为一个配对的标准,你的名字叫小明,那么我之后只需要搜索名字这个键就可以得到小明这个字符串了。
当然,在操作完成之后要记得关闭map和dat文件(先后顺序),之后打开这个dat,你会发现我们得到了一个天书
,看不懂?看不懂就对了[滑稽],这是计算机二进制加密后的结果,反正她能看懂就行
2024年04月06日 03点04分 6
level 9
Acilen- 楼主
打开f1,我们发现读取也挺简单[滑稽],这里不多赘述,直接引用NichtsHsu大佬的例子,谁看谁明白
2024年04月06日 03点04分 7
level 9
Acilen- 楼主
你会发现,文件的读写似乎并不是难事,真正的难点在于怎么实现,不过别着急,咱们先把ini讲完[滑稽][茶杯]
ini可以理解为一种更牛逼的txt文件,当然这个暴论会引起大佬们的血压飙升[狂汗],实际上,ini也可以用电脑自带的记事本来写,这里引用小太的介绍(吧内搜索ini就能看见
哇![惊讶]那这么牛逼的文件结构到底该怎么实现呢,我们先来看我的一个例子
2024年04月06日 03点04分 8
level 9
Acilen- 楼主
在这个例子中,我们使用了两个obj,gm用来控制存档读档,object0用来标识。
读一读代码(只看下方没被注释的),很容易明白框架逻辑,打开ini,ini_write_(real/string)写入数据,关闭ini,如出一辙的方式,我们随便放几个object0,得到了这个ini(由于gm8设计缺陷,ini只能放在同一目录下,可以用苞米的插件修改(链接失效了我也没找着,实在需要请联系玉米然后发我一份[滑稽]))
其中,endless是我们的section,用来引领全文,举个栗子,我在做的是类植物大战僵尸游戏,那么我就可以在endless结构下存放无尽模式的数据,在normal结构下存放冒险模式的,而结构下面则是类似于配对的东西,一一对应且很方便代码修改删除,ini的好处就是非常非常直观,调试的时候很方便看出错误,矛盾点在于他是明文数据,玩家很容易就修改了,但我很喜欢这一点,对于gm的小游戏来说,修改和破解也挺有意思的,激起了玩家的探索心(?)
2024年04月06日 04点04分 9
level 9
Acilen- 楼主
吃个饭,回来更,今天我要吃卤肉饭[吐舌]
2024年04月06日 04点04分 10
level 11
[真棒] 支持分享
2024年04月06日 12点04分 11
吧务
level 13
已收录至精华帖分类:研究记录
嘛,不过从咱的角度来说,更推荐新人用的是数组(方括号直接访问)+ini。数据结构方面跨过map是因为map会产生一串难以人力读取的字串,至少萌新读起来很吃力(不过8楼的文件内容,似乎没用到map结构的样子)。ini确实是最方面易学的文件结构,不过一般只用来存储固定数量的配置信息,一般endless这种可能有不定数量的数据要存时不太理想。如果有余力和合适的工具,还是建议试试文本文件/二进制文件的。能拿二进制存文件的话,以后转到S2时几乎可以无缝流畅过渡到buffer直存直读,超级丝滑流畅。
2024年04月07日 07点04分 12
感谢豆姐指点!个人感觉ini好处就是非常直观,初涉外部资源时调试比较方便[滑稽],但这种文本类型在稳定性和保密性上确实比不上二进制或者文本,这个贴写了map和ini的原因也是因为这俩在gm里操作逻辑上比较近似,操作很容易实现,所以挨一块写了
2024年04月07日 08点04分
@Acilen- 不过gm的ini操作函数似乎都包含了“找一下,没有的话自动新建”这个功能,小的更新覆盖加入“新键”操作还是很丝滑,有空我学习一下二进制再来补充[老虎]
2024年04月07日 08点04分
level 9
Acilen- 楼主
在这里我们仔细讲一讲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()”等来将他于我们的游戏变量进行拼接来区分
2024年04月07日 10点04分 13
level 9
Acilen- 楼主
然后同理,我们逆向写入读取函数,并用循环让她把独到的数据生成出来(这里使用了object_index来获得对象的索引,以此作为obj生成的依据,注意如果这个值是0的话可能会出现巧合性bug)
2024年04月07日 11点04分 14
level 9
Acilen- 楼主

接下来我们打开生成的ini文件,,呱啊!真是简洁直观口牙[惊讶]每一个数据都看得清清楚楚(,这样一来,不仅自己可以很方便直观地调试,玩家打不过也可以自己来改数据,省去了风灵月影的麻烦(?),如果需要的话,对于这种外置数据的处理,你大可以自己用python或者干脆用gm就能做一个外置修改器,原理也就是反向的修改和读取一次,也是非常简单的[乖]
2024年04月07日 11点04分 15
level 14
虽然没看懂,但是感觉好像可以用于制作地图编辑器,回头学习一下,谢谢[阴险]
2024年04月10日 07点04分 16
[乖]确实很适合用来做地图编辑器,用文档形式可以给好基友传输地图
2024年04月10日 08点04分
咱的看法不变,ini用来在刚入门时测试文件读写还行,批量数据存储不是最适用的。编辑地图数据的话,最好是直接二进制(或者buffer直存/压缩存储)。
2024年04月11日 01点04分
@q糖豆p 昨天学戈多也了解了一下二进制,确实是更完善的方案[真棒]
2024年04月11日 01点04分
1