GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

192 信息 1091 成员
游戏开发工具 GameMaker Studio 2 的讨论小组

在GMS中使用DS MAP存储/读取游戏信息

顺子 2017-09-19

之前介绍了在GameMaker Studio中使用自带函数和ini文件进行存/读档的方法,其实还有另一种方法,即采用GMS中的几种数据结构来保存数据——ds_map、ds_list、ds_grid等并且在GMS中自带了十分方便的方法可以直接把这些数据结构保存成物理文件(对应也有方法可以读取这些文件),今天以ds_map为例介绍一下这种方法,希望能有帮助。而保存和读取文件主要会使用到的方法是:

  • ds_map_secure_save
  • ds_map_secure_load

而要使用ds_map来保存数据,首先我们要对这种数据结构有一个大致的了解:

Image title

如上图,我们可以把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只要内存不炸理论上可以多个同时操作

在写这篇教程的时候找到了几篇详细介绍数据结构的教程,好像很棒,过几天找时间翻译一下:)

(转发自:原日志地址

近期喜欢的会员

 
ltzibaozhe 2020-02-13

中文解释就是好啊!兄弟 再出点类似的教程吧!

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册