【问题标题】:Saving Box2D shapes保存 Box2D 形状
【发布时间】:2017-02-07 01:17:20
【问题描述】:

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

对于每个物体,我保存了世界位置、角度、AngularVelocity 和 LinearVelocity。我还需要保存吗?

我只是想知道是否真的不可能完全保存 Box2D 世界的状态。

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

【问题讨论】:

  • 它们的大小和形状都一样吗? ...否则我看不出这 4 个变量如何足够。
  • 我也在保存体形,我只是提到了动态数据。
  • 您可能会发现这很有用:iforce2d.net/b2djson
  • 谢谢,我会深入研究该代码,看看他们在做什么可能与我的代码不同。

标签: box2d


【解决方案1】:

b2worlddump功能。它将有关世界的所有信息放入日志文件中。所以你可以看到这个日志文件并了解你需要保存什么。

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

【讨论】:

  • 谢谢,我试试看。
【解决方案2】:

对于每个物体,我保存了世界位置、角度、AngularVelocity 和 LinearVelocity。我还需要保存吗?

从对 Box2D 2.3.2 b2Body 成员变量(在 b2Body.h 中)的回顾中,您可能还想保存:

  • 主体的顺序(也许通过将它们保存为从b2World 访问它们的顺序,就像b2World::Dump() 所做的那样),
  • 线性和角度阻尼值(通过b2Body::GetLinearDamping()b2Body::GetAngularDamping()),
  • 重力刻度(通过b2Body::GetGravityScale()),
  • 类型(通过b2Body::GetType()),
  • is-bullet 值(通过b2Body::IsBullet()),
  • is-sleeping-allowed 值(通过b2Body::IsSleepingAllowed()),
  • is-awake 值(通过b2Body::IsAwake()),
  • is-active 值(通过b2Body::IsActive()),
  • is-fixed-rotation 值(通过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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多