【问题标题】:Artemis Entity System FrameworkArtemis 实体系统框架
【发布时间】:2014-04-03 08:59:26
【问题描述】:

我是 Artemis 实体系统框架的新手,我想知道是否有办法获取所有具有特定组件或组件的实体? (应该有,但我找不到。)

例如,我想查找所有具有EnemyComponent 的实体,并检查它们是否与任何具有BulletComponent 的实体发生冲突。我该怎么做?

【问题讨论】:

  • 即将推出的 artemis-odb 版本 0.10.0 支持检索属于某个方面的所有实体的视图。在此之前,请使用管理器或 ES 来跟踪实体。 EntitySystem#getActives 也可以。

标签: entity entity-system artemis


【解决方案1】:

您可以做的是创建一个系统,该系统将在您的碰撞系统中调用,以获取具有所选组件的所有实体的列表。

例如:

public class FindBulletsSystem extends EntitySystem {
  private ImmutableBag<Entity> bullets;
  private boolean processingFlag = false;

  public FindBulletsSystem () {
    super(Aspect.getAspectForAll(BulletComponent.class));

  }

  @Override
  protected boolean checkProcessing() {
    if (processingFlag) {
      processingFlag = false;
      return true;
    }
    return false;
  }

  @Override
  protected void processEntities(ImmutableBag<Entity> entities) {
         bullets = entities;

  }

  public ImmutableBag<Entity> getAllBullets() {
    bullets = null;
    processingFlag = true;

    this.process();
    return bullets;
  }

}

在你的碰撞系统中,你可以通过调用这个系统来获得子弹:

world.getSystem(FindBulletsSystem.class).getAllBullets();

【讨论】:

  • 这是 Artemis 提供的 API 框架中的一个很好的解决方案。但我认为在这种情况下正确的做法是使用组。我已经看到几个演示这样做了:code.google.com/p/gamadu-starwarrior/source/browse/src/com/…您对此有何看法?
  • 我认为这取决于您的需要。如果我必须检查与敌人、墙壁、树木、窗户和游戏中每个物体的碰撞,我不会去组队。在这种情况下,我可能会创建一个组件,它会告诉我该对象可以被击中。在您的情况下,只有 Enemy/Bullet 碰撞组似乎是一个很好的解决方案。
  • 在这种情况下,我必须创建这种辅助系统,这不是一个方便的解决方案。不幸的是,框架不支持必要的功能。
  • 我认为这是使系统能够相互通信的想法:“实体或组件之间不通信,但系统可以与其他系统通信。您可以在您的系统中检索其他系统系统通过使用 World 实例。您可以定义您认为系统间通信所需的任何方法。"
  • findBulletSystem->process() 在 getAllBullets() 方法中被调用。 checkProcessing() 正在 process() 方法中使用,如果它返回 false,则不会调用 processEntities 方法。
【解决方案2】:

也许我在禁止您从组件管理器中按组件类型检索组件方面过于严格,但我确信当时这是有充分理由的,强制执行严格的 api。

“BulletComponent”和“EnemyComponent”的问题在于它们是标志,用于指示它们所属的组的类型。它们是否包含任何数据?如果你有一个处理 FlagComponent 的 FlagSystem,它有一个标志数组。您可以从此 flagSystem 请求具有某些标志的实体。

但是没有一种方法可以做到这一点。您可以创建自己的 Manager 类,也可以使用系统来执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多