我是 Artemis 实体系统框架的新手,我想知道是否有办法获取所有具有特定组件或组件的实体?(应该有,但我找不到。)
例如,我想查找所有具有 a 的实体EnemyComponent
并检查它们是否与其中包含的任何实体发生冲突BulletComponent
。我怎样才能做到这一点?
我是 Artemis 实体系统框架的新手,我想知道是否有办法获取所有具有特定组件或组件的实体?(应该有,但我找不到。)
例如,我想查找所有具有 a 的实体EnemyComponent
并检查它们是否与其中包含的任何实体发生冲突BulletComponent
。我怎样才能做到这一点?
您可以做的是创建一个系统,该系统将在您的碰撞系统中调用以获取具有所选组件的所有实体的列表。
例如:
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();
也许我在禁止您从组件管理器中按类型检索组件方面过于严格,但我确信这在当时是有充分理由的,强制执行严格的 api。
“BulletComponent”和“EnemyComponent”的问题在于它们是标志,用于指示它们所属的组的类型。它们是否包含任何数据?如果你有一个处理 FlagComponent 的 FlagSystem,它有一个标志数组。您可以从此 flagSystem 请求具有某些标志的实体。
但是没有一种方法可以做到这一点。您可以创建自己的 Manager 类,也可以使用系统来执行此操作。