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

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

使用实体系统开发游戏的方法非常清晰。你有组件,你将它们添加到实体。根据您使用的组件类型,不同的系统开始处理每个实体的状态。例如,您将 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); }

这也可能有用:https://www.iforce2d.net/b2dtut/drawing-objects

关于box2d - 如何在 Box2D 中使用实体系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22226939/

相关文章:

java - libgdx 实用程序 HTML

graphics - 如何检查3D网格的凸度?

c++ - 一个简单的 png 库,用于基于 c++ win32 图 block 的游戏引擎

math - 如何用弧形角段几乎连接两个点?

ios - box2d 调试绘图不工作

java - 在 libgdx 中碰撞时出现主体的空错误(虽然不是)

game-engine - 适用于 Windows Phone 8 的 Libgdx

swift - 为什么 applyImpulse 在 swift spritekit 中不起作用?

ios - SpriteKit SKPhysicsBody 与内边缘

ios - Box2d Body在cocos2d-x中的运动