作为我的保存/加载游戏代码的一部分,我需要保存世界上所有Box2D主体的状态。当我这样做然后加载并重新创建它们时,会有一些快速弹出,其中一些主体彼此分开。我已经对我的保存游戏信息进行了双重和三重检查,这是正确的。
对于每个身体,我都保存世界位置,角度,AngularVelocity和LinearVelocity。我需要保存更多吗?
我只是想知道是否真的无法完全保存Box2D世界的状态。
我在iOS中使用C ++ Box2d代码。
答案 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()
),b2Body::IsBullet()
),b2Body::IsSleepingAllowed()
),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;
}
当然,如果没有写访问权限,这将是不完整的。虽然可行,但这可能会更加困难,这取决于您是否希望能够在构建身体时恢复睡眠时间,或者在构造之后设置它(通过设置器)就足够了(后者可能是较少的代码,但前者可能是更具语义吸引力)。无论如何,如果您还想查看加载值的代码,请告诉我。