使用 Javascript 保存游戏

Posted

技术标签:

【中文标题】使用 Javascript 保存游戏【英文标题】:Saving a game with Javascript 【发布时间】:2013-02-24 03:57:43 【问题描述】:

假设我有一个在 html5 画布上绘制的 javascript 游戏,它会循环更新和绘制一堆对象。保存游戏当前状态的最佳方法是什么?我想我可以循环遍历所有对象并以加载函数可以读取的格式以文本形式写入所有值,但这对我和游戏来说似乎都是相当多的工作,以及大量保存文件大小。有一个更好的方法吗?我以前从来没有做过这样的事情,我真的不知道从哪里开始。

谢谢。

【问题讨论】:

jquery serialize?另一方面,这只会节省一切。您最好编写一个仅提取相关数据的函数。例如精灵的 x/y 坐标很重要。它的位图表示不是,因为您可以轻松地重建它。 【参考方案1】:

这样的标准做法是维护一个代表您的系统的数据模型和一个代表您的模型的视图。模型应该主要是数据,可能相对复杂,但它包含您的视图渲染所需的所有信息。

假设此模型是一个对象树,您只需调用 var serialized = JSON.stringify(model) 将您的数据模型序列化为字符串,然后调用 var model = JSON.parse(serialized) 将其取回。这是一个非常简单但不灵活的方法,但这是一个开始。

使用localStorage 可以快速存储此信息,但您可能希望转移到后端存储,在该后端存储中将值放入 REST 服务(或类似的服务),以便这些数据可以可以从任何地方检索。

我建议研究类似 MVC 的框架,例如 Backbone.js(例如),它可以帮助您将模型与视图分开,并且在从数据存储中持久化/混合数据方面做得很好。

【讨论】:

太好了,非常感谢。我不知道你可以这样做,我只是做了一个小测试,看起来很实用。【参考方案2】:

您需要对“序列化”和“反序列化”的关键字进行一些研究。

我建议您让所有游戏对象都实现一个序列化函数,而不是对每个对象进行递归循环。您可以使用 JSON 来构建整个对象树,每个对象决定需要保留哪些属性,以及可以从其余部分派生哪些属性。虽然这似乎在某些级别上与递归循环做同样的事情,但最大的区别在于每个对象都可以自己定义如何序列化/反序列化自身及其内容..

根据您希望保存游戏状态的精确程度,您可以通过这种方式减少大量数据。例如,也许您可​​以简单地将它们重置为当前关卡的开头,或者您可以转储一些其他地方可用的数据(例如,关卡数据可能不应该存储在保存文件中,只有关于游戏状态的信息这让您可以使用现有的关卡数据存储重现关卡)。

【讨论】:

以上是关于使用 Javascript 保存游戏的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP 获取信息到 HTML5 JavaScript 游戏

HTML5 & Javascript Canvas 游戏 - 如何让玩家能够保存他们的游戏

尝试使用 localStorage 在 JavaScript 中保存和加载带有对象的数组时出错

JavaScript-Runoob:JavaScript 变量

在 Cocos2d Javascript 游戏中将文件保存到服务器

xferring javascript 变量以发布变量的实际代码