Statemanager



  • Hey cpp-freunde,
    Ich gebe gleich mal zu anfang zu, dass ich noch nicht soo viel ahnung von c++ habe dementsprechend, hab ich aktuell meine problemchen mit meinem projekt.

    Ich komme von Java, ich bina uf c++ umgestiegen weils mir einfach sinnvoller erscheint mein projekt, ein 2d RPG, in cpp zu realisieren. da ich auch in java eigentlich an spielen nur kleinkram in einfachster weise zusammengekleistert habe, dachte ich mir steige ich auf c++ um, um dann auch direkt die basis draufzuhaben um größere spiele anzugehen. nun sitze ich hier.

    Zu meinem Problem: Ich würde gern in mein Spiel einen Statemanager implementieren.
    jedoch wollte ich ewiglange switch-abfragen vermeiden, dementsprechend habe ich bissl rumgegoogelt. es gabe verschiedene ansätze wie diese zu implementieren sind als beispiel in nem Stack. wie etwa das hier: http://gamedevgeek.com/tutorials/managing-game-states-in-c/
    leider ist mir das noch etwas zu hoch, einfach cpy&pst wollte ich nicht.
    bin dann noch auf andere sachen gestoßen die mir aber auch nicht wirklich weiterhelfen konnten.

    nun was ich konkret erreichen möchte.
    ich suche eine möglichkeit wie ich mit hilfe eines pointers der iwo zwischengespeichert ist, im mainloop die gewünschten funktionen(eventhandling,logik und rendern) der klassen(Intro, Game, Pause, etc.) aufzurufen. Innerhalb der Stateklassen soll dann gewechselt werden können.

    es klingt eigentlich soo einfach aber ich komm einfach nicht drauf wie ich das angehen soll. die heißen tage haben anscheinend mein hirn vollkommen weichgekocht, hehe.
    in der regel bettel ich eig. nicht um code aber ich bin wirklich fertig und es wäre wunderbar wenn iwie ein ansatz kommen könnte.

    mfg Magixen



  • Du suchst vermutlich das State Design Pattern welches ein naher Verwandte des Strategy Design Patterns ist.



  • vielen dank für die antwort aber ich hab eher an sowas gedacht wie die states als singletons du designen die die virtuellen methoden überschreiben von der sie erben. in einem Statemanager der ebenfalls nen singleton ist ist dann auch der pointer gespeichert, welcher auf das stateobjekt verweist. da der statemanager ebenfalls ein singleton ist und sich selbst instatiiert wäre es dann möglich im mainloop

    while(window.isopen){
    statemanager::instance().pointerToState->Input();
    statemanager::instance().pointerToState->logic();
    statemanager::instance().pointerToState->draw();
    }
    // grade zusammengeklatscht wahrscheinlich fehler drin^^
    

    auf diese weise zuzugreifen.
    und wechseln tu ich innerhalb der stateklassen dann folgenderweise

    statemanager::instance().pointerToState = gewuenschtestate::instance();
    

    Das wirkt auf mich aber nicht sehr schlau gemacht. vllt gibts ja iwie etwas das ich verpasst hab. das alles als singleton gemacht ist gefällt mir einfach nicht.

    ps. sry für offtopic aber das muss ich mal loswerden.. 19 TAUSEND posts! echt krank..xDD



  • magixen schrieb:

    das alles als singleton gemacht ist gefällt mir einfach nicht.

    Nein, das ist wirklich absurd.

    DerEineState a;
    DerAndereStabe b;
    DerSpezielleState c;
    
    BasisState *state = &a;
    
    while(window.isopen){
      state->input();
      state->logic();
      state->draw();
      state = state->next(); // state gibt einen Pointer auf den nächsten State zurück (oder this, wenn keine Änderung)
    }
    

Log in to reply