如何进行游戏存储(How to make savegames)

1
Published on 11 Mar, 2014. 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!