如何在Box2D中使用实体系统?

时间:2014-03-06 14:08:33

标签: box2d game-engine game-physics entity-system artemis

使用Entity Systems开发游戏的方法非常明确。您有组件,您将它们添加到实体。根据您拥有的不同类型的组件,系统会开始处理每个实体的状态。例如,您将Position和Velocity组件添加到实体,实体正在处理我的Movement和Collision系统。运动系统正在进行欧拉积分(这是一个基本模型),如:

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

碰撞系统说运行一些简单的碰撞算法。

现在如果我想使用Box2D的功能并使用库的引擎怎么办?我是否应该为位置和速度组件设置一个重复的坐标和速度,另一个是b2Body的位置?我应该同步吗?当实体系统和物理库协同工作时,这种系统的常用方法是什么?

是否有任何使用例如Artemis和Box2D的语言的示例?

2 个答案:

答案 0 :(得分:4)

通常,您将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

答案 1 :(得分:2)

我在这里找到了box2d + artemis的一个例子:http://blog.gemserk.com/2012/02/02/how-we-use-box2d-with-artemis/

简而言之,他们使用PhysicsComponentbox2d.body制作了box2d.contacts并将其附加到他们的实体。