在GMS中使用DS MAP存储/读取游戏信息
之前介绍了在GameMaker Studio中使用自带函数和ini文件进行存/读档的方法,其实还有另一种方法,即采用GMS中的几种数据结构来保存数据——ds_map、ds_list、ds_grid等并且在GMS中自带了十分方便的方法可以直接把这些数据结构保存成物理文件(对应也有方法可以读取这些文件),今天以ds_map为例介绍一下这种方法,希望能有帮助。而保存和读取文件主要会使用到的方法是:
- ds_map_secure_save
- ds_map_secure_load
而要使用ds_map来保存数据,首先我们要对这种数据结构有一个大致的了解:
如上图,我们可以把ds_map想像成这样一个数据集合,其实它的数据结构跟ini配置文件十分类似,只是少了一个"section"的分类,其中的数据同样是由一对对"key"、"value"构成。而GMS中针对ds_map也有大量内置函数可以用于数据的增删改查:
- ds_map_exists
- ds_map_create
- ds_map_add
- ds_map_clear
- ds_map_copy
- ds_map_replace
- ds_map_delete
- ds_map_empty
- ds_map_size
- ds_map_find_first
- ds_map_find_last
- ds_map_find_next
- ds_map_find_previous
- ds_map_find_value
- ds_map_read
- ds_map_write
- ds_map_destroy
有关ds_map的相关函数可以看这里——映射表(DS Map)
接下来,我们用一个实际的例子来说明一下如何用ds_map来保存游戏信息:
假设我们现在有一个简单的RPG游戏,现在要保存游戏进度,我们需要保存的内容有英雄的等级、血量、攻击力,以及英雄身上的装备的信息
save_1 = ds_map_create(); //创建一个ds_map保存到save_1变量中
//
ds_map_add(save_1,"Head",hero_head);// 在save_1中增加一个key为"Head"的数据,值为hero_head
ds_map_add(save_1,"Right Hand",hero_right_hand);//同上
ds_map_add(save_1,"Left Hand",hero_left_hand);//同上
ds_map_add(save_1,"Level",hero_level);//在save_1中增加一个key为“Level”的数据,值取hero_level对应的值
ds_map_add(save_1,"HP",hero_hp);//同上
ds_map_add(save_1,"Attack",hero_attack);//同上
ds_map_secure_save(save_1, "save1.dat" ) ;//把save_1中的ds_map保存为一个名为"save1.dat"的物理文件
ds_map_destroy(save1.dat);//释放内存
通过以上操作我们就可以完成我们之前的目标,将需要保存的信息通过ds_map进行储存并加密保存为一个物理文件,由于这种保存方式自带加密操作,因此存档文件的安全性较ini配置文件要更高。而当游戏中执行加载存档的方法时我们可以这么做:
load_save = ds_map_secure_load("save1.dat")//加载"save1.dat"文件中的ds_map保存到"load_save"中
//加载ds_map中的数据保存到游戏变量中
hero_head = ds_map_find_value(load_save, "Head");
hero_right_hand = ds_map_find_value(load_save, "Right Hand");
hero_left_hand = ds_map_find_value(load_save, "Left Hand");
hero_level = ds_map_find_value(load_save, "Level");
hero_hp = ds_map_find_value(load_save, "HP");
hero_attack = ds_map_find_value(load_save, "Attack");
ds_map_destroy(load_save);//释放内存
以上,其实从原理上来说跟ini配置文件的使用方式是十分类似的,但是个人更推崇这种方式
- 加密性更好
- ds_map的数据结构也更好与ds_list和ds_grid等联动
- ini配置文件同时只能开启一个,ds_map只要内存不炸理论上可以多个同时操作
在写这篇教程的时候找到了几篇详细介绍数据结构的教程,好像很棒,过几天找时间翻译一下:)
(转发自:原日志地址)
中文解释就是好啊!兄弟 再出点类似的教程吧!