共计 2446 个字符,预计需要花费 7 分钟才能阅读完成。
如何制作保存游戏
本教程是 Construct 团队推荐的!这意味着它包含有用的、高质量的信息,将帮助您成长为一名游戏开发人员。
Construct 3 提供了一种制作保存游戏的简单方法。这些允许您的玩家保存游戏,然后稍后返回并从他们离开的地方加载它。这对于长时间的游戏很重要,尤其是当关卡或阶段很长时。虽然可以使用非常简单的“最后达到的级别”类型来保存本地存储,通常很难使用它来保存每个最后一个对象的完整状态。System 对象的 Save 和 Load 操作方便地允许您执行此操作,让您只需很少的努力即可轻松添加完整的保存游戏功能。
基本 SAVEGAME 支持
添加保存游戏的一种简单方法是在按下某个键时使用系统的保存和加载操作。例如:
对于手机游戏,您显然需要使用某种触摸输入,但为了简单起见,我们将专注于桌面游戏。
Savegames 由浏览器存储在本地系统上。这意味着玩家可以关闭他们的电脑或设备,第二天回来,并且仍然可以成功加载保存游戏。但请注意,savegames 与特定浏览器相关联。例如,Firefox 和 Chrome 将分别存储游戏存档; 如果玩家在使用 Chrome 时保存了游戏,然后切换到 Firefox,他们将无法加载该保存游戏。
Savegames 不会保存在缓存中。浏览器缓存是一种非常临时的存储,用于在网页上保存图像等内容,而无需每次都重新下载它们,并且会定期清理。Savegames 被保存到 IndexedDB 存储中,该存储更永久。但是,用户仍然可以手动清除其存储空间,这也会擦除 IndexedDB。
节省插槽
允许玩家拥有多个保存游戏通常很有用。这是保存槽允许的。每个插槽都像一个单独的文件,用于存储不同的保存。您可以为玩家提供一组要保存的插槽,或者允许他们输入自己的保存游戏名称。
请注意,大多数浏览器对网页可以保存到磁盘的数据量都有限制。对于大多数游戏来说,这不太可能成为问题,但如果您有大量单独的保存槽,您可能会达到存储限制。提供有限数量的保存槽是确保您永远不会达到限制的好方法。适当使用“不保存”行为也有助于缩小保存游戏的规模(见下文)。
已完成的触发器
保存可能需要一些时间才能完成,同时游戏会在此期间继续运行。保存完成后,“系统”触发器将触发“保存完成”触发器。同样,加载可能需要一些时间才能完成,并在完成后触发加载完成。请注意,在“保存”操作之后、但在“保存完成”触发器之前所做的任何更改仍可能被保存。
如果您尝试从尚未保存到的插槽加载,将触发加载失败。如果用户选择要加载的保存槽,您可能只想在此事件中开始一个新的新游戏。
“不保存”行为
任何带有无保存行为不会被保存,并且在加载时不会受到影响。将“不保存”行为添加到任何静态对象(如风景和背景)是一种很好的做法。它还可以用于自动更新的对象,如 HUD 和每次刻度更新的文本对象。这不会对游戏产生任何影响,但它使保存游戏更小,保存和加载更快,因为省略了不必要的信息。
保存后更改项目
Savegames 应该对项目中的变化具有鲁棒性。您应该能够添加、删除和重新排序各种内容,例如变量、行为和其他对象,并且仍然可以成功加载旧的保存游戏。但请注意,您添加的任何新内容都不会有其保存数据,因此在加载时不会受到影响。另请注意,如果从项目中删除任何内容,它也将无法再次加载。您可以删除单个实例而不影响 savegames,但如果您删除整个对象类型、布局或图层,它们将永远不会从 savegame 中加载回来。
高级主题
到目前为止,涵盖的所有内容都足以让大多数游戏轻松添加保存游戏功能。但是,高级用户可能会对以下主题感兴趣,这些主题将进一步详细介绍 savegame 系统。
跟踪使用了哪些插槽
系统保存 / 加载操作不会告诉您已保存到哪些插槽。跟踪此情况的最佳方法是在本地存储对象中自行存储一些额外的元数据。例如,每当您保存到插槽时,还要编写一个本地存储密钥,指示插槽已保存到。您可以添加一些其他元数据,例如玩家名称,甚至是游戏的小屏幕截图作为数据 URI。然后,您可以从已保存的本地存储数据中判断出哪些插槽正在使用。您可以通过调整这些元数据键来执行其他操作,例如重置或清除保存的游戏数据,例如删除它们以使其看起来插槽再次是空的。
保存的内容和未保存的内容
游戏的完整状态 – 包括实例变量、全局和局部变量、行为属性、效果、粒子、当前播放的音频等 – 将被保存。然而,也有一些例外,希望这些都不足为奇。以下内容不会保存,并且在加载时不会受到影响:
- 输入状态(即鼠标位置,或玩家是按住按键还是触摸)
- AJAX 请求
- WebSocket 连接
- XML 对象
- 用户媒体视频或音频源
- 任何服务(如 Facebook)的登录状态
- 本地存储状态
- 在任何平台上进行任何应用内购买
- 具有“不保存”行为的任何内容
直接使用 JSON 数据
在 On save complete 和 On load complete 触发器中,系统表达式返回 savegame 的所有 JSON 数据的字符串。请注意,表达式将在这些触发器之外返回一个空字符串; 触发器是您直接访问数据的唯一机会。SaveStateJSONSaveStateJSON
如果您有自己的服务器,则可以通过将 JSON 数据与 AJAX 对象一起发布到服务器并将其存储在服务器数据库中来创建共享保存游戏。或者,某些平台允许您存储已登录用户的数据存储,并在他们登录的任何地方共享数据。这对于允许用户随身携带保存游戏非常有用。
取回 JSON 字符串后,可以使用 Load from JSON 系统操作从中加载游戏。
版本控制
通常,您将能够更改您的项目,并且旧游戏仍然可以正常加载。但是,一些高级用户可能希望准确跟踪保存游戏来自他们项目的哪个版本。您可以使用全局变量来执行此操作。调用变量 Version 并将其初始化为 1。稍后,如果您发布游戏的新版本,请将变量的初始值更改为新数字,例如 2。现在,当触发加载完成时,全局变量已加载并设置为使用保存操作时的 Version 值。如果您向游戏中添加了大量新对象,但想要确保在加载旧的存档游戏时它们被销毁或隐藏,这可能会很有用。