如何儲存遊戲進度(How to make savegames)

1
Published on 1 May, 2016. Last updated 25 Feb, 2019

Construct 2可以非常簡便的實現遊戲存檔。通過一些操作,你可以實現讓玩家存儲遊戲, 並在之後再回到遊戲時繼續上次的進度。這對於比較長的遊戲非常重要,尤其是有些時候關卡本身就很長,存檔就顯得格外重要了。其實通過WebStorage就可以很容易的實現“關卡跳轉”功能。但這個用跳轉關還可以,卻很難實現關卡中的,場景完全重現的即時存檔。System 物件SaveLoad動作可以很方便的幫你實現這些,能夠讓你用很少的操作來創建複雜的存檔。

基礎存檔支持

最簡單的添加遊戲存檔的方式,就是當按下某個按鍵時,調用系統的Save和Load動作,比如:

如果是手機或平板遊戲,你還是要做一個可觸摸的按鈕來代替按鍵,這裡我們為簡化討論,先以桌面遊戲為例。

遊戲存檔是被流覽器寫在硬碟上的。這意味著玩家可以關掉電腦或手機,第二天再開機,仍然可以順利讀取存檔。需要注意的是,遊戲存檔是和流覽器相關聯的。比如,Firefox和Chrome會各自生成獨立的存檔;如果一個玩家用Chrome玩遊戲建了個存檔,然後換成Firefox,他會無法載入之前的存檔。

存檔不是寫在緩存裡的。流覽器緩存是一種非常臨時性的存儲空間,主要用來把圖片、網頁存在本地,減少重複下載。緩存是會被定期清除的。還好存檔不是寫在緩存而是寫在網路存儲或索引資料庫中。這兩種存儲都是永久性的,不會受用戶清除緩存的影響。

存檔位

一般遊戲都會允許玩家建立多個存檔。這就要說到存檔位了。每個存檔位就相當於一個獨立的存檔檔。你可以給玩家提供多個存檔位來進行存檔,也可以讓他們來自己命名存檔。

注意大多數流覽器對頁面可在磁片存儲的資料量都有限制。這對大多數遊戲來說都不成問題,但如果你的存檔檔數量過多,那就不得不考慮這個限制了。給存檔位元加一個數量限制是避免突破系統限制的好方法。合理運用“禁止存儲”屬性也可以有效減少存檔體積(詳見下文)。

完成事件

創建存檔需要一小段時間,這段時間裡遊戲仍會繼續運行。當存檔完成後,系統會調用存檔完成事件。同樣,讀取也需要一段時間來完成,完成後會觸發讀取完成事件。注意,所有在存檔動作之後但在存檔完成動作之前發生的變化,也都被記錄的存檔中。

如果嘗試從一個尚未建立存檔的存檔位中進行讀取,就會觸發讀取失敗事件。如果用戶選擇了一個存檔讀取,並觸發了讀取失敗事件,就會開始一個新的遊戲。

“禁止存儲”屬性

任何帶有禁止存儲屬性的物體都不會被存檔,載入時也不會受到影響。我們推薦給靜止物體添加禁止存儲 屬性,比如背景藍天、樹、房子之類的。禁止存儲屬性也常被加在自動更新物體上,比如HUD(遊戲上方顯示分數、血量之類資訊的地方),比如一些每幀都更新的文本物體。這些做法對遊戲本身基本沒什麼影響,但得益於無用資訊的去除,會使遊戲存檔更小,遊戲存儲和讀取更快。(同樣也會使continuous preview更有效率)

關於存儲後的專案變更

遊戲存儲對於專案變更的支援是比較完善的。你可以對變數、屬性以及其他物體進行諸如添加、刪除、重排之類的動作,舊的存檔仍然會順利載入。注意,因為你後添加的新物體沒有被存檔記錄過任何資料,所以當載入存檔不會對它們產生影響。還要注意,如果你從專案中移除了某個物體,載入遊戲時它將不會再出現。刪除單個實例不會影響到遊戲存儲,但如果移除的是整個物體類型、佈局或層,它們就無法通過存檔重新載入進來了。

高級

前面說的這些對於給大多數遊戲設置一個遊戲的存檔已經足夠了。但高級用戶或許會對如何更深層次的設置存檔系統感興趣。

查詢被訪問的存檔位

系統的save/load事件不會告訴你是剛才讀取/寫入了哪一個存檔位。確定被訪問存檔位的最佳方法就是你自己額外存儲一些中繼資料到存檔中:例如,當你向一個存檔位中寫入存檔時,同時寫入一個關鍵字來標識這個存檔位元。你可以添加一些像是玩家姓名資訊、甚至一小張螢幕截圖來作為資料的位址。這樣你就能說明你的存檔存入了哪個存檔位中。通過這些關鍵字你還可以對存檔資料進行重置或刪除操作,比如移除這些資訊後存檔位元看起來就像被清空了一樣。

什麼被保存了,什麼沒被保存

遊戲的整個舞臺——包括執行個體變數、全域和本地變數、行為屬性、特效、粒子、正在播放的音訊等等都會被保存下來。當總有些例外,下面這些東西不會被保存,也不會受載入的影響:

- 輸入情況(例如滑鼠位置、玩家是否按住某個鍵,是否在觸摸)

- AJAX請求

- WebSocket連接

- XML物體

- 使用者視頻或音訊播放進度

- Facebook登陸信息

- 網路存儲情況

- CocoonJS / Windows 8情況

- 任何平臺的內購

- 所有帶有「禁止存儲」屬性的物體

直接調用JSON資料

存檔完成載入完成事件觸發後,系統的SaveStateJSON會返回一個由遊戲存檔的所有JSON資料組成的字串。注意,在被其他事件觸發的時候SaveStateJSON只會返回空的字串;這兩個事件是你直接訪問資料的唯一方法。

如果你自己有伺服器,可以用AJAX來把JSON數據傳到伺服器上,把存檔存入伺服器的資料庫中,實現存檔資料的共用。有些平臺,比如Win8,Clay.io允許登錄的使用者把資料存儲到伺服器上進行漫遊。這對於用戶隨時隨地調用他們的存檔來說十分有用。

當你獲取到返回的JSON字串後,可以通過Load from JSON動作來還原存檔。

版本管理

通常情況下你可以修改你的專案並且舊版本的遊戲也會順利載入。有些用戶希望能精確地最終到所使用的存檔是又哪個版本的專案生成的。你可以使用一個全域變數來實現這個功能。建一個叫版本的變數,並初始化為1。之後每次更新版本的時候改變這個變數數值,比如2。這樣,當遊戲載入完成後,當前的遊戲會使用生成這個存檔時的遊戲的版本號。這在你創建了很多新物體,載入舊存檔後想確定它們是否會被移除或隱藏時非常有用。

  • 0 Comments

Want to leave a comment? Login or Register an account!