说实话,我不太确定从哪个问题开始。 我将描述这种情况:我正在为HTML5游戏制作关卡编辑器。关卡编辑器已经正常运行 - 现在我想保存/加载用这个编辑器创建的关卡。
因为这一切都是在Javascript(关卡编辑器以及游戏)中完成的,所以我在考虑将保存简单地将关卡转换为JSON和加载,以及......解开它。< / p>
问题是 - 关卡包含几种类型的对象(几种不同类型的实体,几种类型的动画对象等等)。现在,每次我想在游戏中添加一个对象我都要写一个专门针对该对象的unjsonify方法,然后修改level对象的unjsonify方法,以便它可以处理对新定义的对象类型的解除。
我不能简单地使用JSON.parse,因为它只返回一个具有与原始键相同的键和值的对象,但它实际上并不是该类/原型的对象。我的问题是,有没有一种正确的方法来做到这一点,每次我想在游戏中添加新类型的对象时都不需要不断修改代码?
答案 0 :(得分:0)
我会在每个对象上创建serialise / deserialise方法,将它们的状态放入JSON对象并从中恢复。复合对象将递归地序列化/反序列化它们的子对象。举个例子:
function Player {
this.weapon = new Weapon();
}
Player.prototype.serialise = function () {
return {'type': 'Player', weapon: this.weapon.serialise()};
}
Player.deserialise = function(json_object) {
var player = new Player();
player.weapon = Weapon.deserialise(json.weapon);
return player;
}
显然,在实际代码中,您需要进行检查以确保获得所期望的对象类型。在序列化/反序列化期间可以简单地复制数组和简单哈希对象,尽管它们的子代通常需要被递归。