作为保存/加载游戏代码的一部分,我需要保存世界上所有Box2D实体的状态。当我这样做,然后加载并重新创建它们时,有一个快速弹出,其中一些身体彼此分离。我已经反复检查了我的保存游戏信息,它是正确的。
对于每个物体,我保存了世界位置、角度、AngularVelocity和LinearVelocity。我还需要保存更多内容吗?
我只是在想,是否真的不可能完全拯救Box2D世界的状态。
我正在使用iOS中的C++ Box2d代码。
发布于 2012-01-21 18:01:14
有b2world的dump函数。它把关于这个世界的所有信息都放入日志文件中。因此,您可以查看此日志文件,并了解需要保存的内容。
PS:我自己没有尝试过这个功能
发布于 2017-02-07 01:17:20
对于每个物体,我保存了世界的位置,角度,AngularVelocity和LinearVelocity。我还需要保存更多内容吗?
根据对Box2D 2.3.2 b2Body成员变量(在b2Body.h中)的回顾,您可能还希望保存:
b2World::Dump()一样以从b2World访问它们的顺序保存它们),b2Body::GetLinearDamping()和b2Body::GetAngularDamping()),<代码>H113重力刻度(通过<代码>D14),<代码>H215<代码>H116类型(通过<代码>D17),<代码>H218<代码>H119项目号值(通过<代码>D20),<代码>H221<代码>H122允许休眠的值(通过<代码>D23),<代码>H224<代码>H125是唤醒值(通过<代码>D26),
b2Body::IsActive()),b2Body::IsFixedRotation()),b2Body::GetFixtureList()),b2Body::GetUserData()),不幸的是,最后三个状态值没有可读的公共访问权限。
如果你的世界有关节,你可能也想保存它们,但我建议从世界的角度来保存它们。
我只是在想,是否真的不可能完全保存Box2D世界的状态。
这取决于你在游戏中做了什么,以及你愿意在代码方面做什么。
如果你正在施加力或力矩,而你的世界没有设置为自动清除这些力,那么从纯粹的b2Body角度来看:no。OTOH,如果你在施加力或力矩,你可以自己保存它们,在这种情况下,力和力矩是可以保存的:,yes,。
睡眠时间,这将是一个问题,它对你有多重要。如果你想在以后重新加载你的游戏,这样它就会像从来没有暂停过一样恢复,那么至少从用户级别的角度来看,你会被卡住;答案是no。OTOH yes,如果你愿意修改Box2D库源代码的话。
例如,您可以向b2Body.h文件添加代码,如下所示,提供对睡眠时间状态的读取访问权限:
class b2Body
{
public:
...
/// Get the sleep time.
float32 GetSleepTime() const;
...
};
...
inline float32 b2Body::GetSleepTime() const
{
return m_sleepTime;
}当然,如果没有写访问,这也是不完整的。虽然可行,但这可能会更加困难,这取决于您是希望在构造body时恢复睡眠时间,还是在构造后设置睡眠时间(通过setter)就足够了(后者代码较少,但前者可能在语义上更吸引人)。无论如何,如果你也想看看加载值的代码,请告诉我。
https://stackoverflow.com/questions/8948362
复制相似问题