使用实体系统开发游戏的方法非常清晰。你有组件,你将它们添加到实体。根据您使用的组件类型,不同的系统开始处理每个实体的状态。例如,您将 Position 和 Velocity 组件添加到一个实体,并且实体正在处理我的 Movement 和 Collision 系统。运动系统正在进行欧拉积分(这是一个基本模型),例如:
x = Vx*dt;
y= Vy*dt;
Vx = Ax*dt;
Vy = Ay*dt;
碰撞系统说运行一些简单的碰撞算法。
现在如果我想使用 Box2D 的强大功能并使用库的引擎怎么办?我是否应该有重复的坐标和速度,一个用于位置和速度组件,另一个用于 b2Body 的位置?我应该同步它们吗?当实体系统和物理库一起工作时,这种系统的常用方法是什么?
是否有使用 Artemis 和 Box2D 等语言的示例?
最佳答案
通常,您会将 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); }
关于box2d - 如何在 Box2D 中使用实体系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22226939/