保存Box2D形状

时间:2012-01-20 21:54:51

标签: box2d

作为我的保存/加载游戏代码的一部分,我需要保存世界上所有Box2D主体的状态。当我这样做然后加载并重新创建它们时,会有一些快速弹出,其中一些主体彼此分开。我已经对我的保存游戏信息进行了双重和三重检查,这是正确的。

对于每个身体,我都保存世界位置,角度,AngularVelocity和LinearVelocity。我需要保存更多吗?

我只是想知道是否真的无法完全保存Box2D世界的状态。

我在iOS中使用C ++ Box2d代码。

2 个答案:

答案 0 :(得分:1)

dump的{​​{1}}功能。它将有关世界的所有信息放入日志文件中。因此,您可以看到此日志文件,并了解您需要保存的内容。

PS:我自己没试过这个功能

答案 1 :(得分:1)

  

对于每个身体,我都在保存世界位置,角度,AngularVelocity和LinearVelocity。我需要保存更多吗?

通过对Box2D 2.3.2 b2Body成员变量(b2Body.h)的评论,您可能还想保存:

  • 正文的排序(可能是按b2World b2World::Dump()访问它们的顺序保存它们,
  • 线性和角度阻尼值(通过b2Body::GetLinearDamping()b2Body::GetAngularDamping()),
  • 重力比例(通过b2Body::GetGravityScale()),
  • 类型(通过b2Body::GetType()),
  • is-bullet值(通过b2Body::IsBullet()),
  • 允许睡眠的值(通过b2Body::IsSleepingAllowed()),
  • is-awake值(通过b2Body::IsAwake()),
  • 是活跃值(通过b2Body::IsActive()),
  • 固定旋转值(通过b2Body::IsFixedRotation()),
  • 灯具列表及其订单(通过b2Body::GetFixtureList()),
  • 用户数据(通过b2Body::GetUserData()),
  • 力量,
  • 扭矩,
  • 睡眠时间。

不幸的是,对这些最后三个州的值没有可读的公共访问权。

如果你的世界有关节,你可能也想保存那些我建议从世界角度保存的那些。

  

我只是想知道是否真的无法完全保存Box2D世界的状态。

这取决于你在游戏中做了什么,以及你愿意以代码方式做什么。

如果您正在施加力量或力矩,并且您的世界未设置为自动清除这些力量,则从纯b2Body角度来看:。 OTOH,如果你正在施加力或力矩,你可以自己保存,在这种情况下力和力矩可以保存:

睡眠时间,这对你来说有多重要。如果你希望能够在以后重新加载你的游戏,使它恢复到完全没有被暂停的状态,那么至少从用户层面来看,你会被困住;答案是。 OTOH ,如果您愿意修改Box2D库来源。

例如,您可以将代码添加到b2Body.h文件中,如下所示,提供对睡眠时间状态的读访问权:

class b2Body
{
public:
    ...

    /// Get the sleep time.
    float32 GetSleepTime() const;

    ...
};

...

inline float32 b2Body::GetSleepTime() const
{
    return m_sleepTime;
}

当然,如果没有写访问权限,这将是不完整的。虽然可行,但这可能会更加困难,这取决于您是否希望能够在构建身体时恢复睡眠时间,或者在构造之后设置它(通过设置器)就足够了(后者可能是较少的代码,但前者可能是更具语义吸引力)。无论如何,如果您还想查看加载值的代码,请告诉我。