Для каждого тела я сохраняю мировую позицию, угол, 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()
),
- текущее значение (через
b2Body::IsAwake()
),
- значение is-active (через
b2Body::IsActive()
),
- значение фиксированного вращения (через
b2Body::IsFixedRotation()
),
- список приборов и его порядок (через
b2Body::GetFixtureList()
),
- пользовательские данные (через
b2Body::GetUserData()
),
- сила,
- крутящий момент и
- время сна.
К сожалению, нет доступного для чтения публичного доступа к последним трем значениям состояния.
Если в вашем мире есть суставы, вы также можете сохранить их, но те, которые я бы посоветовал сохранить с точки зрения мира.
Мне просто интересно, возможно ли полностью сохранить состояние мира Box2D.
Это зависит от того, что вы делаете в своей игре и что вы готовы делать с кодом.
Если вы применяете силы или моменты, и ваш мир не настроен на автоматическую очистку этих сил, то с чисто b2Body
точки зрения: нет . OTOH, если вы применяете силы или моменты, вы можете сохранить их самостоятельно, в этом случае силы и моменты могут быть сохранены: да .
Время сна, вопрос в том, насколько это важно для вас. Если вы хотите иметь возможность перезагрузить свою игру позже, чтобы она возобновлялась точно так же, как никогда раньше, то, по крайней мере, с точки зрения пользовательского уровня, вы застряли; ответ нет . OTOH yes , если вы хотите изменить исходные тексты библиотеки Box2D.
Например, вы можете добавить код в файл b2Body.h, как показано ниже, который обеспечивает доступ для чтения к состоянию времени ожидания:
class b2Body
{
public:
...
/// Get the sleep time.
float32 GetSleepTime() const;
...
};
...
inline float32 b2Body::GetSleepTime() const
{
return m_sleepTime;
}
Конечно, это не было бы полным без доступа для записи. Хотя это может быть выполнимо, это может быть более трудным в зависимости от того, хотите ли вы иметь возможность восстановить время сна для построения тела или если достаточно установить его после сборки (с помощью установщика) (последний код меньше, но, возможно, первый быть более семантически привлекательным). В любом случае, дайте мне знать, если вы хотите увидеть код для загрузки значения.