Как использовать системы сущностей с Box2D?

Подход к разработке игр с Entity Systems очень ясен. У вас есть компоненты, вы добавляете их в сущности. В зависимости от того, какой компонент у вас есть, разные системы начинают обрабатывать состояние каждого объекта. Например, вы добавляете компоненты Position и Velocity к объекту, а объект обрабатывается в моих системах Movement и Collision. Система движения выполняет интеграцию Эйлера (которая является элементарной моделью), например:

x = Vx*dt;
y= Vy*dt;
Vx = Ax*dt; 
Vy = Ay*dt;

А системы столкновений говорят, что работает какой-то простой алгоритм столкновений.

А что если я захочу использовать мощь, например, Box2D и использовать движок библиотеки. Должны ли я иметь повторяющиеся координаты и скорости, одну для компонентов Position и Velocity, а другую - для позиции b2Body? Должен ли я синхронизировать их? Каков обычный подход для систем такого типа, когда системы сущностей и физическая библиотека работают вместе?

Есть ли примеры на любом языке, который использует, например, Artemis и Box2D?

2 ответа

Решение

Обычно вы сохраняете тело Box2D в качестве переменной-члена вашей сущности и передаете всю информацию о местоположении этому телу. Например:

class Entity {
    b2Body* body;
};

Если вы также хотите, чтобы тело Box2D имело ссылку на объект, которому он принадлежит, вы можете установить это в "пользовательских данных" тела:

body->SetUserData( this );

Вместо дублирования и синхронизации объект может просто использовать информацию из тела Box2D:

b2Vec2 Entity::GetPosition() { return body->GetPosition(); }
float  Entity::GetAngle()    { return body->GetAngle(); }

void Entity::SetPosition( b2Vec2 p ) { body->SetTransform(p, body->GetAngle()); }
void Entity::SetAngle( float a )     { body->SetTransform(body->GetPosition(), a); }

Это также может быть полезно: https://www.iforce2d.net/b2dtut/drawing-objects

Я нашел пример box2d + artemis здесь: http://blog.gemserk.com/2012/02/02/how-we-use-box2d-with-artemis/

Короче говоря, они сделали PhysicsComponent с box2d.body а также box2d.contacts и прикрепил его к своим сущностям.

Другие вопросы по тегам