(To, co opisuję, opiera się na tym projekcie: Co to jest struktura systemu encji? Przewiń w dół, a znajdziesz ją)
Mam problemy z tworzeniem systemu encji-komponentów w C ++. Mam swoją klasę Component:
class Component { /* ... */ };
Który jest w rzeczywistości interfejsem do tworzenia innych komponentów. Aby stworzyć niestandardowy komponent, po prostu implementuję interfejs i dodam dane, które będą używane w grze:
class SampleComponent : public Component { int foo, float bar ... };
Te komponenty są przechowywane w klasie Entity, co nadaje każdej instancji Entity unikalny identyfikator:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
Komponenty są dodawane do encji, mieszając nazwę komponentu (prawdopodobnie nie jest to świetny pomysł). Kiedy dodam niestandardowy komponent, jest on zapisywany jako typ komponentu (klasa bazowa).
Z drugiej strony mam interfejs systemu, który korzysta z interfejsu węzła. Klasa Node służy do przechowywania niektórych komponentów pojedynczej encji (ponieważ System nie jest zainteresowany wykorzystaniem wszystkich komponentów encji). Gdy system musi update()
, musi tylko iterować przechowywane w nim węzły utworzone z różnych podmiotów. Więc:
/* 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 */
};
Teraz problem: powiedzmy, że buduję SampleNodes, przekazując encję do SampleSystem. SampleNode następnie „sprawdza”, czy jednostka ma wymagane komponenty do użycia przez SampleSystem. Problem pojawia się, gdy potrzebuję dostępu do żądanego komponentu wewnątrz Entity: komponent jest przechowywany w Component
kolekcji (klasy podstawowej), więc nie mogę uzyskać dostępu do komponentu i skopiować go do nowego węzła. Tymczasowo rozwiązałem problem, przypisując Component
typ pochodny, ale chciałem wiedzieć, czy istnieje lepszy sposób na zrobienie tego. Rozumiem, czy oznaczałoby to przeprojektowanie tego, co już mam. Dzięki.