欢迎光临散文网 会员登陆 & 注册

RPGMakerMV探秘02-存档

2020-08-09 15:48 作者:狂奔小菜鸡  | 我要投稿

    一般情况下,RPGMaker都是单机游戏,单机游戏必然会涉及到存档,本文我们就来聊一聊RPGMakerMV的存档。

    探秘系列的第一篇我们已经介绍,引擎存档位置在save目录下。

    其实新建项目时,是不存在save目录的,当进行存档时,才会新建save目录。

    不使用插件的情况下,存档位置有20个,如果超过了20就只能覆盖之前的存档。

存档界面


    当我进行首次存档时(选的第一个存档位置),将产生以下文件。

首次存档(存档位置1)

    两个rpgsave文件打开后都是“天书”,这不是人能看懂的。想知道这些“天书”藏了什么秘密,我们就一起来探索一下。


    首先我们找到存档界面:

    rpg_scenes.js中定义了Scene_Save,Scene_Save继承自Scene_File。在Scene_Save部分,我们发现了一个方法onSavefileOk,这个方法应该就是存档的动作。

Scene_Save存档动作

    其中核心的部分就4行,DataManager.saveGame(this.savefileId())。savefileId是文件编号,也就是存档界面中文档X里的X。


    接着,我们来到rpg_managers.js,找到上述的saveGame方法。

DataManager.saveGame

    看到第四行,该方法又调用了本身的saveGameWithoutRescue,那只有接着往下看。


saveGameWithoutRescue

    看到这里,我们大概看到了一些数据的处理,逐渐的,我们开始了解到“天书”的形成。

    第二行,this.makeSaveContents(),字面意思就是形成存储内容,去看看如何形成,包含了哪些东西。

    JsonEx.stringify是将对象JSON序列化转换成JSON字符串的方法,那多半makeSaveContents生成的就是一个JSON对象。


生成存档内容

    果不其然,makeSaveContents返回的就是一个JSON对象,包含了除$gameTemp,$gameMessage,$gameTroop以外的游戏数据。

    可能大家还想知道这些游戏数据里面是什么,数据较多,我们就在控制台输出下$gameActors看下,这个对象里是什么。

$gameAcotors

    $gameActors实际是rpg_object中定义的Game_Actors,而Game_Actors是角色数组的一个包装类,简单的说就是Game_Actors中包含了所有角色的信息。

    从$gameActors我们也能看出一些熟悉的信息,如默认角色“霍尔德”,各项状态信息(生命值、魔法值、幸运值等)以及装备信息、技能信息,与角色相关的信息通过该对象都能体现出来。


    让我们回到saveGameWithoutRescue方法,既然数据已经形成,接下来就是进行存储了。存储前,还做了数据大小的校验,过大会发出警告。估计是WEB端,存储是放在浏览器localStorage中的,各个浏览器厂商对localStorage的大小都有限制,例如chrome的localStorage最大支持5M,如果超过5M是无法进行存储的(当然方法也有,这里就不展开了)。


    接着往下看,StorageManager.save(savefileId, json)进行了数据的存储。

    

save

    saveToLocalFile、saveToWebStorage分别是存储至本地文件系统及存储至浏览器的方法。

    

    这里我们简单看下存储至本地文件系统的过程:

    

saveToLocalFile

    第二行就解释了“天书”的形成原因,LZString是JavaScript的一个库,compressToBase64将字符串压缩并编码,形成了我们看不懂的“天书”。接下来就是创建本地目录,将字符串写入本地文件中。

    

    

saveToWebStorage

    存储至浏览器的处理过程类似,只是最终将数据放在了localStorage。


    以上过程就是RPGMakerMV的存档过程。

    单机游戏不可或缺的一部分就是SL大法,今天我们大概分析了下S,下回我们捋一捋L。

RPGMakerMV探秘02-存档的评论 (共 条)

分享到微博请遵守国家法律