【问题标题】:How to use entity systems with Box2D?如何在 Box2D 中使用实体系统?
【发布时间】:2014-04-09 05:36:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    简而言之,他们用box2d.bodybox2d.contacts 制作了一个PhysicsComponent,并将其附加到他们的实体上。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但是如果我需要位置坐标来渲染但我不需要物理呢?
      • 有没有一个Artemis + Box2d的例子?
      • 你不需要物理???然后你不需要 b2Body 成员变量,你可以让实体自己持有位置。我不知道阿耳忒弥斯在抱歉什么……也许你应该提出一个新问题。
      • @iforce2d 拥有一个必须为实体定义组件的类不是实体组件系统设计。
      猜你喜欢
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2012-09-01
      • 1970-01-01
      相关资源
      最近更新 更多