Как использовать системы сущностей с 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
и прикрепил его к своим сущностям.