2014-03-02 118 views
0

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

例如,我想查找所有拥有EnemyComponent的实体,并检查它们是否与其中有BulletComponent的任何实体相冲突。我怎样才能做到这一点?

+0

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

回答

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(); 
+2

这是Artemis提供的API框架中的一个很好的解决方案。但我认为在这种情况下做正确的事情是使用组。我看过几个演示:https://code.google.com/p/gamadu-starwarrior/source/browse/src/com/gamadu/starwarrior/systems/CollisionSystem.java您对此有何看法? – Narek

+0

我认为这取决于你的需要。如果我不得不检查与敌人,墙壁,树木,窗户和游戏中的每个物体的碰撞情况,我都不会去参加团体活动。在这种情况下,我可能会创建一个Component来告诉我该对象可以被击中。 在你的情况只有敌人/子弹碰撞组似乎是一个很好的解决方案。 – Suwer

+0

在这种情况下,我必须创建这种辅助系统,这不是一个方便的解决方案。不幸的是,框架不支持必要的功能。 – Narek

1

也许是我从它们的类型从检索组件禁止你太严组件管理器,但我确信当时有一个很好的理由,执行严格的API。

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

但是没有办法做到这一点。你可以创建你自己的管理员类,或者你可以用系统来完成。