1

我正在编写一个 2D 重力模拟游戏,我正在尝试添加保存/加载功能。在游戏中,我将所有当前行星存储在一个数组中。每个行星都由一个 Body 对象表示,该对象包含行星的坐标、质量和运动矢量。它还存储了行星最后 100 个坐标的数组,以便在屏幕上绘制行星的轨迹。

我想使用 JSON.stringify() 来序列化行星数组。我想保存每个行星的第一个属性(质量、位置、运动),但我不需要保存最后 100 个坐标(轨迹数组)。我不想完全删除坐标,否则轨迹将从屏幕上消失。我可以只对每个对象的一部分进行字符串化吗?如果没有,我可以在编码后删除 JSON 字符串的那部分吗?或者我应该在保存过程中将坐标移动到其他地方,然后在保存后将它们复制回每个星球?

4

3 回答 3

2

在现代网络浏览器中,您可以使用Array#map.

var serialized = JSON.stringify(planets.map(function(planet){
  return { 
    mass: planet.mass,
    location: planet.location,
    motion: planet.motion
  };
}));

或者,使用for循环的等价物。

于 2013-01-06T00:25:07.520 回答
0

试试这种方式

var saved = JSON.stringify( {mass:body.mass,location:body.location,motion:body.motion} );

它只会为您提供三个部分作为 json 字符串。

再扩展一点,您可以为您的 body 类提供这样的导出功能。例如:

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() );
于 2013-01-05T23:56:22.027 回答
0

The best would be to create both a serialization and deserialization method. This will allow you to create the most efficient storage format while still allowing you to reconstruct as much of the objects as you deem necessary. You can use export/import, save/restore, serialize/deserialize terminology, whichever you see fit. Having methods like this will increase you maintainability in the long run as well.

于 2013-01-06T00:18:53.177 回答