Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Silnik 2D - problem z aktualizacją stanów obiektu

Ostatnio zmodyfikowano 2015-07-17 08:31
Autor Wiadomość
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:

C/C++
class World
{
public:
   
    vector < cz ą steczki > czasteczki; //albo list
   
    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ć.
P-134783
RazzorFlame
» 2015-07-16 20:51:38
Powinieneś zrobić coś takiego:
C/C++
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.
P-134794
arczi14
Temat założony przez niniejszego użytkownika
» 2015-07-16 22:17:19
Dziękuje za odpowiedź na to samo wpadłem dzięki temu kursowi:
https://www.youtube.com/watch​?v=9hGPe6BnTY4
Co oczywiście nie umniejsza twojej pomocy dziękuje!

Klasa World także powinna dziedziczyć funkcję wirtualną tak?
P-134801
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.
P-134811
« 1 »
  Strona 1 z 1