Uma solução possível seria substituir a entidade por uma nova entidade sem componentes. Com a configuração que você tem, isso soa como se fosse apenas uma questão de deixar a entidade lá e remover todos os componentes que fazem referência ao ID da entidade. Então, seus sistemas devem pular naturalmente essa entidade, já que ela não tem os componentes que eles precisam.
Ao mesmo tempo, você pode adicionar o índice a uma lista de índices de entidade "recicláveis". Ao criar novas entidades, se houver alguma coisa nessa lista, desloque um índice para fora da lista e use a entidade nesse índice em vez de colocá-lo no final. Ele não terá componentes neste momento, então você pode dar a ele os novos componentes, tornando-o efetivamente uma nova entidade.
Isso pressupõe que seus sistemas pularão entidades que não possuem os componentes necessários. O ideal seria escrever algo assim (c ++):
class GravitySystem : public System<MassComponent, PositionComponent, VelocityComponent> {
public:
GravitySystem() {}
void logic(Entity& e) {
auto mass = e.get<MassComponent>();
auto pos = e.get<PositionComponent>();
auto vel = e.get<VelocityComponent>();
vel->y += 9.81 * mass->value;
pos->x += vel->x;
pos->y += vel->y;
}
};
E, em seguida, no loop do seu jogo, você escreve algo como gravitySystem.process(entities)
e itera sobre cada entidade e aplica a lógica em cada entidade que possui os componentes necessários. Então você não precisa se preocupar com IDs, a menos que você precise deles para outra coisa. Dê uma olhada em darkf / microecs para um exemplo.