我正在编写2D重力模拟游戏,我正在尝试添加保存/加载功能。在游戏中,我将所有当前行星存储在一个数组中。每个行星都由一个Body对象表示,该对象包含行星的坐标,质量和运动矢量。它还存储了行星最后100个坐标的数组,以便在屏幕上绘制行星的踪迹。
我想使用JSON.stringify()来序列化行星数组。我想保存每个行星的第一个属性(质量,位置,运动),但我不需要保存最后100个坐标(轨迹数组)。我不想完全删除坐标,否则轨迹将从屏幕上消失。我可以只对每个对象的一部分进行字符串化吗?如果没有,我可以在编码后删除那部分JSON字符串吗?或者我应该在保存过程中将坐标移动到其他位置,然后在保存后将它们复制回每个行星?
答案 0 :(得分:2)
在现代网络浏览器中,您可以使用Array#map
。
var serialized = JSON.stringify(planets.map(function(planet){
return {
mass: planet.mass,
location: planet.location,
motion: planet.motion
};
}));
或者,等效使用for
循环。
答案 1 :(得分:0)
以这种方式试试
var saved = JSON.stringify( {mass:body.mass,location:body.location,motion:body.motion} );
它只会给你三个部分作为json字符串。
稍微扩展一下,你可以为你的身体类提供这样的导出功能。 例如:
Bodyclass.export = function( toexport ) {
if ( undefined === toexport || toexport.constructor != Array ) {
var toexport = [ 'mass', 'location', 'motion' ];
}
var export = {};
for ( var i = 0; i < toexport; i++) {
export[ toexport[ i ] ] = this[ toexport[ i ] ];
]
}
var saved = JSON.stringify( body.export() );
答案 2 :(得分:0)
最好的方法是创建序列化和反序列化方法。这将允许您创建最有效的存储格式,同时仍允许您根据需要重建尽可能多的对象。 您可以使用导出/导入,保存/恢复,序列化/反序列化术语,无论您认为合适。 拥有这样的方法也可以提高长期的可维护性。