Сохранение форм Box2D - PullRequest
       1

Сохранение форм Box2D

1 голос
/ 21 января 2012

Как часть моего кода сохранения / загрузки игры, мне нужно сохранить состояние всех тел Box2D, которые есть в мире. Когда я делаю это, а затем загружаю и воссоздаю их, возникает быстрый всплеск, когда некоторые тела отделены друг от друга. Я дважды и трижды проверил информацию о сохранении игры, и она верна.

Для каждого тела я сохраняю мировую позицию, угол, AngularVelocity и LinearVelocity. Нужно ли мне что-то еще сохранить?

Мне просто интересно, возможно ли полностью сохранить состояние мира Box2D.

Я использую код C ++ Box2d в iOS.

Ответы [ 2 ]

1 голос
/ 06 февраля 2017

Для каждого тела я сохраняю мировую позицию, угол, 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;
}

Конечно, это не было бы полным без доступа для записи. Хотя это может быть выполнимо, это может быть более трудным в зависимости от того, хотите ли вы иметь возможность восстановить время сна для построения тела или если достаточно установить его после сборки (с помощью установщика) (последний код меньше, но, возможно, первый быть более семантически привлекательным). В любом случае, дайте мне знать, если вы хотите увидеть код для загрузки значения.

1 голос
/ 21 января 2012

Существует dump функция b2world.Он поместил всю информацию о мире в файл журнала.Таким образом, вы можете увидеть этот файл журнала и понять, что вам нужно сохранить.

PS: сам не пробовал эту функцию

...