假设我有一个在 HTML5 画布上绘制的 Javascript 游戏,它会循环更新和绘制一堆对象。保存游戏当前状态的最佳方法是什么?我想我可以遍历所有对象,并以加载函数可以读取的格式以文本形式写入所有值,但这对我和游戏来说似乎都是相当多的工作,以及大量保存文件大小。有一个更好的方法吗?我以前从来没有做过这样的事情,我真的不知道从哪里开始。
谢谢。
假设我有一个在 HTML5 画布上绘制的 Javascript 游戏,它会循环更新和绘制一堆对象。保存游戏当前状态的最佳方法是什么?我想我可以遍历所有对象,并以加载函数可以读取的格式以文本形式写入所有值,但这对我和游戏来说似乎都是相当多的工作,以及大量保存文件大小。有一个更好的方法吗?我以前从来没有做过这样的事情,我真的不知道从哪里开始。
谢谢。
像这样的标准做法是维护一个代表您的系统的数据模型和一个代表您的模型的视图。模型应该主要是数据,可能相对复杂,但它包含视图渲染所需的所有信息。
假设这个模型是一个对象树,你可以调用var serialized = JSON.stringify(model)
将你的数据模型序列化为一个字符串,然后var model = JSON.parse(serialized)
将其取回。这是一个非常简单但不灵活的方法,但它是一个开始。
存储此信息的一种快速方法是使用,localStorage
但您可能希望移动到后端存储,在该后端存储中将值放入 REST 服务(或类似的东西),以便可以从任何地方检索此数据。
我建议研究类似 MVC 的框架,例如 Backbone.js(例如),它可以帮助您将模型与视图分离,并且还可以很好地从数据存储中持久化/混合数据。
您需要对“序列化”和“反序列化”的关键字进行一些研究。
我建议您让所有游戏对象都实现一个序列化函数,而不是对每个对象进行递归循环。您可以使用 JSON 来构建整个对象树,每个对象决定需要保留哪些属性,以及可以从其余部分派生哪些属性。虽然这似乎在某些级别上与递归循环做同样的事情,但最大的区别在于每个对象都可以自己定义如何序列化/反序列化自身及其内容..
取决于您希望保存游戏状态的精确程度,您可以通过这种方式减少大量数据。例如,也许您可以简单地将它们重置为当前关卡的开头,或者您可以转储一些其他地方可用的数据(例如,关卡数据可能不应该存储在保存文件中,只有关于游戏状态的信息这让您可以使用现有的关卡数据存储重现关卡)。