[SFML] Silnik 2D - problem z aktualizacją stanów obiektu
Ostatnio zmodyfikowano 2015-07-17 08:31
arczi14 Temat założony przez niniejszego użytkownika |
[SFML] Silnik 2D - problem z aktualizacją stanów obiektu » 2015-07-16 19:50:22 Witam, Piszę niewielki silnik 2D oparty na SFML, GLSL, OpenGL, na własny użytek, co prawda ciężko to nazwać "silnikiem" ale znajdują się w nim system cząstek, wykrywanie kolizji, obsługa sprites effect, plików ini itd. Z tym, że każdej klasie odpowiada własna funkcja update i jak np stworzymy 10 obiektów systemu cząsteczek to trzeba w pętli 10 razy wykonać funkcję update, czy to w pętli czy inaczej ale trzeba. Więc myślałem nad tym aby to jakoś zunifikować np stworzyć klasę world i tam dodać wszystkie pomniejsze obiekty i zamiast x funkcji update wywołać jedną. Niestety nie mam najmniejszego pojęcia jak się z tym zmierzyć "luka w głowie". Ktoś podpowie jak to można rozwiązać? Pozdrawiam. Jeśli mi pomożecie obiecuje podzielić się tym "silnikiem", a raczej zestawem funkcji z ludźmi z tej społeczności. Początkowo myślałem nad czymś takim: class World { public: vector < cz ą steczki > czasteczki; void UpdateCZ() { size_type lenght = czasteczki.size(); for( int i = 0; i < lenght; i++ ) { ( czasteczki.at( i ) ).update(); } } }
Ale jeśli silnik ma tam 15 klas które wymagają update to jak je wszystkie przekazać do klasy world ? Robić dla każdej z osobna funkcję jest bezsensu, a jak ktoś będzie chciał jakąś inną własną dodać ? (szablony nie wchodzą w gre) Będzie musiał robić kolejny wektor itd... A ja chciałbym, żeby to była klasa jak Kernel która raz napisana nie wymaga zmian nawet przy dodawaniu oklejnych klas w grze. Smierdzi na odległość pliformizmem i dziedziczeniem ale nie mam pojęcia w jaki sposób to rozwiązać. |
|
RazzorFlame |
» 2015-07-16 20:51:38 Powinieneś zrobić coś takiego: class Object { public: virtual void Update( float DeltaInSeconds ) { } }; class Actor : public Object { public: virtual void Update( float DeltaInSeconds ) override { cout << "Class - Actor" << endl; } }; class Item : public Actor { public: virtual void Update( float DeltaInSeconds ) override { cout << "Class - Item" << endl; } }; class Creature : public Actor { public: virtual void Update( float DeltaInSeconds ) override { cout << "Class - Creature" << endl; } } class World { public: std::vector < Object *> AllObjectsContainer; void Update( float DeltaInSeconds ) { for( auto It = AllObjectsContainer.begin(); It != AllObjectsContainer.end(); It++ ) { ( * It ).Update( DeltaInSeconds ); } } };
Czyli stworzyc klasę bazową dla wszystkiego co składa się na grę (nie licząc rendererów albo czegoś w tym stylu) i stworzyć wirtualną metodę "Update" i wykonywać ją w ten sposób. |
|
arczi14 Temat założony przez niniejszego użytkownika |
» 2015-07-16 22:17:19 |
|
RazzorFlame |
» 2015-07-17 08:31:59 Klasa World także powinna dziedziczyć funkcję wirtualną tak? |
Raczej nie, świat nie jest obiektem - on zawiera obiekty. |
|
« 1 » |