Artemis Entity System Framework

Я новичок в платформе Artemis Entity Systems, и я хочу знать, есть ли способ получить все объекты, которые имеют определенный компонент или компоненты в них? (Должен быть, но я не могу найти.)

Например, я хочу найти все объекты, которые имеют EnemyComponent и проверьте, сталкиваются ли они с любым из объектов, которые имеют BulletComponent в них. Как я могу это сделать?

2 ответа

Решение

Что вы можете сделать, это создать систему, которая будет вызываться в вашей системе коллизий, чтобы получить список всех объектов с выбранными компонентами.

Например:

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" заключается в том, что они являются флагами, указывающими тип группы, к которой они принадлежат. Содержат ли они какие-либо данные? Что делать, если у вас есть FlagSystem, которая обрабатывает FlagComponent, который имеет массив флагов. Вы можете запросить у этой сущности flagSystem определенные флаги.

Но нет единого способа сделать это. Вы можете создать свой собственный класс Manager, или вы можете сделать это с системами.

Другие вопросы по тегам