使用Entity Systems开发游戏的方法非常明确。您有组件,您将它们添加到实体。根据您拥有的不同类型的组件,系统会开始处理每个实体的状态。例如,您将Position和Velocity组件添加到实体,实体正在处理我的Movement和Collision系统。运动系统正在进行欧拉积分(这是一个基本模型),如:
x = Vx*dt;
y= Vy*dt;
Vx = Ax*dt;
Vy = Ay*dt;
碰撞系统说运行一些简单的碰撞算法。
现在如果我想使用Box2D的功能并使用库的引擎怎么办?我是否应该为位置和速度组件设置一个重复的坐标和速度,另一个是b2Body的位置?我应该同步吗?当实体系统和物理库协同工作时,这种系统的常用方法是什么?
是否有任何使用例如Artemis和Box2D的语言的示例?
答案 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); }
答案 1 :(得分:2)
我在这里找到了box2d + artemis的一个例子:http://blog.gemserk.com/2012/02/02/how-we-use-box2d-with-artemis/
简而言之,他们使用PhysicsComponent
和box2d.body
制作了box2d.contacts
并将其附加到他们的实体。