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, или вы можете сделать это с системами.