Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

1

30.01.2013, 21:53

Probleme bei der Programmierung eines State-Managers

Hallo Leute,
ich wollte einen State-Manager nach dem Vorbild des StateManagers im Wiki programmieren,
dabei stoße ich auf ein Problem:

C-/C++-Quelltext

1
void StateManager::setState(const string name){ map<string, GameState*>::iterator nextStateIt = states.find(name);  //Wenn der Zustand im Manager registriert ist   if (nextStateIt != states.end())    {       //und nicht der aktuelle ist        if (currentState != *nextStateIt)       {           //Rufe OnLeave() vom alten Zustand auf, falls es einen gab          if (currentState != NULL)               currentState->onExit();                     //setze den neuen aktuellen Zustand             currentState = *nextStateIt;                    //Da zu einem neuen Zustand gewechselt worden ist, rufe das Eingangsereignis auf                currentState->onEnter();            }       }   }}


Der Compiler sagt, dass der != Operator in der Zeile if(currentState != *nextStateIt) mit keinem != Operator übereinstimmt.

Quellcode

1
error C2679: Binärer Operator '!=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::pair<_Ty1,_Ty2>' akzeptiert (oder keine geeignete Konvertierung möglich)



Ich benutze Visual C++ Express 2010

Kann mir jemand helfen?
-patrick246

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

30.01.2013, 21:55

Der Statemanager im Wiki für C++ ist Müll, bau dir nach seinem Vorbild (Funktionen) einen eigenen ;)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

31.01.2013, 06:48

Der Compiler sagt, dass der != Operator in der Zeile if(currentState != *nextStateIt) mit keinem != Operator übereinstimmt.

Nein, das sagt er nicht. Er sagt, dass für den angestrebten Vergleich kein Operator definiert wurde, der den Operanden auf der rechten Seite akzeptiert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

31.01.2013, 10:38

Anstatt eines Strings würde ich eine Enumeration vorschlagen. Da meckert der Compiler wenn du dich vertippst und es einen Wert nicht gibt. Dann kannst du sogar fast darauf verzichten zu überprüfen ob der Zustand hinzugefügt wurde, da das nur der Fall wäre, wenn du es wirklich vergisst ihn hinzuzufügen. Allgemein stimme ich auch zu, das Ding möglichst selbst zu schreiben und dabei nur die Idee zu übernehmen. Am besten ist es die Codefelder einfach geschlossen zu halten und einfach nur den Text zu lesen. Dann schreibt man auch nicht aus Versehen ab.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

5

31.01.2013, 10:41

Ein map Iterator gibt dir ein std::pair, um an den String zu kommen, muss du It->first statt *It schreiben.
http://www.cplusplus.com/reference/utility/pair/
Lieber dumm fragen, als dumm bleiben!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

31.01.2013, 13:37

Der StateManager im Wiki ist einfach nicht fertig implementiert. Der String hatte den Grund, dass es in einer Bibliothek verwendet werden kann. Da bringt dir ein Enum nichts ;)

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

7

31.01.2013, 19:27

Werde es nun wahrscheinlich mit einem Stack machen und die Klassen direkt bei der Übergabe erstellen. Kann es da irgendwelche Probleme geben?
-patrick246

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

31.01.2013, 19:34

Ein Stack erlaubt keine vollständige Statemachine oder wächst unendlich an. Ich stelle mir dabei z.B. die Zustände A, B und C vor mit den folgenden Übergängen: (A->B), (B->C), (C->A).
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

01.02.2013, 01:21

Ich finde die Stack-Variante durchaus sinnvoll. Bei Blocks 5 verwende ich einen Stack ;)
Damit kann man schöne Sachen machen: wenn ich aus dem Spiel heraus in die Optionen gehe, werden die Optionen einfach oben drauf gepusht. Der Spielzustand bleibt darunter erhalten, wird aber nicht aktualisiert. Bin ich in den Optionen fertig (Pop), komme ich automatisch wieder zurück zum Spiel. Und wenn ich aus dem Hauptmenü heraus in die Optionen gekommen bin, dann komme ich wieder ins Hauptmenü zurück.
Man muss auch nicht immer Push/Pop machen, manchmal ist es auch sinnvoll den obersten Zustand durch einen anderen zu ersetzen (wenn es kein logisches "Zurück" gibt, z.B. vom Ladebildschirm ins Spiel hinein - es macht keinen Sinn später nochmal zum Ladebildschirm zurückzugehen). Tut man das immer, dann hat man genau die gleiche "Mächtigkeit" wie ein endlicher Automat bzw. ein klassischer State-Manager. Wenn man will, hat man aber auch mehr. Unendliches Anwachsen wird in der Praxis nicht passieren.

Hier noch ein Link zu einem Artikel, der es auch mit einem Stack umsetzt:
http://gamedevgeek.com/tutorials/managing-game-states-in-c/

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

01.02.2013, 07:19

Ok, wie kann ich dann popState von einem GameState aus aufrufen? Soll ich dem Konstruktor einen Zeiger auf den StateManager übergeben?

Werbeanzeige