(O que estou descrevendo é baseado neste design: o que é uma estrutura de sistema de entidades ? , role para baixo e você a encontrará)
Estou tendo problemas para criar um sistema de componente de entidade em C ++. Eu tenho minha classe Component:
class Component { /* ... */ };
Na verdade, é uma interface para outros componentes serem criados. Então, para criar um componente personalizado, eu apenas implementei a interface e adicionei os dados que serão usados no jogo:
class SampleComponent : public Component { int foo, float bar ... };
Esses componentes são armazenados dentro de uma classe Entity, que fornece a cada instância de Entity um ID exclusivo:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
Os componentes são adicionados à entidade com hash no nome do componente (provavelmente essa não é uma ótima idéia). Quando adiciono um componente personalizado, ele é armazenado como um tipo de componente (classe base).
Agora, por outro lado, eu tenho uma interface de sistema, que usa uma interface de nó dentro. A classe Node é usada para armazenar alguns dos componentes de uma única entidade (como o Sistema não está interessado em usar todos os componentes da entidade). Quando o sistema precisa update()
, ele só precisa percorrer os Nós armazenados, criados a partir de diferentes entidades. Então:
/* System and Node implementations: (not the interfaces!) */
class SampleSystem : public System {
std::list<SampleNode> nodes; //uses SampleNode, not Node
void update();
/* ... */
};
class SampleNode : public Node {
/* Here I define which components SampleNode (and SampleSystem) "needs" */
SampleComponent* sc;
PhysicsComponent* pc;
/* ... more components could go here */
};
Agora o problema: digamos que eu construa o SampleNodes passando uma entidade para o SampleSystem. O SampleNode "verifica" se a entidade possui os componentes necessários para serem utilizados pelo SampleSystem. O problema aparece quando preciso acessar o componente desejado dentro da Entidade: o componente é armazenado em uma Component
coleção (classe base), portanto, não consigo acessar o componente e copiá-lo para o novo nó. Resolvi o problema temporariamente convertendo-o Component
em um tipo derivado, mas queria saber se existe uma maneira melhor de fazer isso. Entendo se isso significaria redesenhar o que eu já tenho. Obrigado.