RPGMakerMV探秘02-存檔
????一般情況下,RPGMaker都是單機游戲,單機游戲必然會涉及到存檔,本文我們就來聊一聊RPGMakerMV的存檔。
????探秘系列的第一篇我們已經(jīng)介紹,引擎存檔位置在save目錄下。
????其實新建項目時,是不存在save目錄的,當(dāng)進行存檔時,才會新建save目錄。
????不使用插件的情況下,存檔位置有20個,如果超過了20就只能覆蓋之前的存檔。

????當(dāng)我進行首次存檔時(選的第一個存檔位置),將產(chǎn)生以下文件。

????兩個rpgsave文件打開后都是“天書”,這不是人能看懂的。想知道這些“天書”藏了什么秘密,我們就一起來探索一下。
????首先我們找到存檔界面:
????rpg_scenes.js中定義了Scene_Save,Scene_Save繼承自Scene_File。在Scene_Save部分,我們發(fā)現(xiàn)了一個方法onSavefileOk,這個方法應(yīng)該就是存檔的動作。

? ? 其中核心的部分就4行,DataManager.saveGame(this.savefileId())。savefileId是文件編號,也就是存檔界面中文檔X里的X。
????接著,我們來到rpg_managers.js,找到上述的saveGame方法。

????看到第四行,該方法又調(diào)用了本身的saveGameWithoutRescue,那只有接著往下看。

????看到這里,我們大概看到了一些數(shù)據(jù)的處理,逐漸的,我們開始了解到“天書”的形成。
????第二行,this.makeSaveContents(),字面意思就是形成存儲內(nèi)容,去看看如何形成,包含了哪些東西。
????JsonEx.stringify是將對象JSON序列化轉(zhuǎn)換成JSON字符串的方法,那多半makeSaveContents生成的就是一個JSON對象。

????果不其然,makeSaveContents返回的就是一個JSON對象,包含了除$gameTemp,$gameMessage,$gameTroop以外的游戲數(shù)據(jù)。
????可能大家還想知道這些游戲數(shù)據(jù)里面是什么,數(shù)據(jù)較多,我們就在控制臺輸出下$gameActors看下,這個對象里是什么。

????$gameActors實際是rpg_object中定義的Game_Actors,而Game_Actors是角色數(shù)組的一個包裝類,簡單的說就是Game_Actors中包含了所有角色的信息。
????從$gameActors我們也能看出一些熟悉的信息,如默認(rèn)角色“霍爾德”,各項狀態(tài)信息(生命值、魔法值、幸運值等)以及裝備信息、技能信息,與角色相關(guān)的信息通過該對象都能體現(xiàn)出來。
????讓我們回到saveGameWithoutRescue方法,既然數(shù)據(jù)已經(jīng)形成,接下來就是進行存儲了。存儲前,還做了數(shù)據(jù)大小的校驗,過大會發(fā)出警告。估計是WEB端,存儲是放在瀏覽器localStorage中的,各個瀏覽器廠商對localStorage的大小都有限制,例如chrome的localStorage最大支持5M,如果超過5M是無法進行存儲的(當(dāng)然方法也有,這里就不展開了)。
????接著往下看,StorageManager.save(savefileId, json)進行了數(shù)據(jù)的存儲。
????

????saveToLocalFile、saveToWebStorage分別是存儲至本地文件系統(tǒng)及存儲至瀏覽器的方法。
????
????這里我們簡單看下存儲至本地文件系統(tǒng)的過程:
????

????第二行就解釋了“天書”的形成原因,LZString是JavaScript的一個庫,compressToBase64將字符串壓縮并編碼,形成了我們看不懂的“天書”。接下來就是創(chuàng)建本地目錄,將字符串寫入本地文件中。
????
????

????存儲至瀏覽器的處理過程類似,只是最終將數(shù)據(jù)放在了localStorage。
????以上過程就是RPGMakerMV的存檔過程。
????單機游戲不可或缺的一部分就是SL大法,今天我們大概分析了下S,下回我們捋一捋L。