Если начать проверять наличие у сущности иных компонент, помимо того что это противоречит концепции ECS, это затронет выборку из памяти за пределами отображения и сильно снизит производительность системы. Поэтому системе не стоит работать с компонентами за пределами своей выборки.Как раз хотел делать именно так, но теперь понимаю что это было плохим решением. Буду делать с локальными системами под конкретные компоненты интерполяции и целевые компоненты.
class Entity
{
public:
template <typename ComponentClass>
ComponentClass *get()
{
auto found = m_components.find(std::type_index(typeid(ComponentClass)));
if (found != m_components.end())
{
return static_cast<ComponentClass *>(found->second.get());
}
else
return nullptr;
}
private:
std::unordered_map<std::type_index, std::unique_ptr<Component>> m_components;
};
std::vector<std::unique_ptr<Entity>> m_entities;
template <typename... T>
void each(typename identity<std::function<void(T& ...)>>::type func)
{
for(auto &entity: m_entities)
{
// тут хочу отобрать только те entity в которых есть каждый из компонентов
// вызвать для каждого типа
auto component = entity.get<тип>();
...
auto componentN = entity.get<типN>();
// и тут вызвать func(component, ..., componentN)
}
}
EntityManager entities;
auto entity = entities.createEntity();
entity->add<Position>(1, 2);
entity->add<Color>(color::red);
entities.each<Position, Color>([](Position &pos, Color &col){
// тут меняем pos и сол
})
Если кому интересно, сделал так: