3

使用实体系统开发游戏的方法非常明确。你有组件,你将它们添加到实体中。根据您使用的组件类型,不同的系统开始处理每个实体的状态。例如,您将位置和速度组件添加到实体,而实体正在处理我的运动和碰撞系统。运动系统正在做欧拉积分(这是一个基本模型),例如:

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

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

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

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

4

2 回答 2

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

于 2014-03-07T03:37:48.833 回答
2

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

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

于 2014-07-29T13:17:35.967 回答