(Quello che sto descrivendo si basa su questo disegno: cos'è un sistema di entità? Scorri verso il basso e lo troverai)
Sto riscontrando alcuni problemi durante la creazione di un sistema con componenti entità in C ++. Ho la mia classe Component:
class Component { /* ... */ };
Che è in realtà un'interfaccia, per la creazione di altri componenti. Quindi, per creare un componente personalizzato, devo solo implementare l'interfaccia e aggiungere i dati che verranno utilizzati nel gioco:
class SampleComponent : public Component { int foo, float bar ... };
Questi componenti sono archiviati all'interno di una classe Entity, che fornisce a ciascuna istanza di Entity un ID univoco:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
I componenti vengono aggiunti all'entità tramite l'hashing del nome del componente (questa probabilmente non è una grande idea). Quando aggiungo un componente personalizzato, viene archiviato come tipo Componente (classe base).
Ora, invece, ho un'interfaccia di sistema, che utilizza un'interfaccia di nodo all'interno. La classe Node viene utilizzata per archiviare alcuni dei componenti di una singola entità (poiché il Sistema non è interessato all'utilizzo di tutti i componenti dell'entità). Quando è necessario update()
, il sistema deve solo scorrere i nodi archiviati creati da entità diverse. Così:
/* 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 */
};
Ora il problema: diciamo che costruisco i SampleNodes passando un'entità al SampleSystem. Il SampleNode quindi "controlla" se l'entità ha i componenti richiesti per essere utilizzati dal SampleSystem. Il problema si presenta quando ho bisogno di accedere al componente desiderato all'interno dell'Entità: il componente è archiviato in una Component
raccolta (classe base), quindi non posso accedere al componente e copiarlo sul nuovo nodo. Ho temporaneamente risolto il problema lanciando il Component
down a un tipo derivato, ma volevo sapere se esiste un modo migliore per farlo. Capisco se questo significherebbe riprogettare ciò che già ho. Grazie.