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