C# XNA Spiel wechselt nicht anständig Gamestates

Tech-Nick

Lt. Junior Grade
Dabei seit
Dez. 2011
Beiträge
498
Guten Abend,

folgendes Problem: Ich schreibe im Rahmen meiner Facharbeit an einem Spiel, es soll eine Art "Flappy Bird" werden, in C# mit XNA Gamestudio.

Um die verschiedenen Phasen zu realisieren (Startmenü, Game Over, Info-Button..) habe ich mittels enumeration verschiedene GameStates deklariert.

Der aktuelle GameState sollte natürlich wechseln können, wenn ich etwa im Startmenü auf "Start" klicke, komme ich nach "GetReady". So die Theorie. Dies klappt auch in den meisten Fällen, lediglich zwei Ausnahmen, die ich mir (und mein Lehrer auch nicht) erklären konnten.

Code:
if (CurrentGameState == GameState.Start)
            {

                    beenden1.checkClicks(Mouse.GetState());
                    start.checkClicks(Mouse.GetState());
                    info.checkClicks(Mouse.GetState());


                    if (start.getClicked())
                        CurrentGameState = GameState.GetReady;

                    if (beenden1.getClicked())
                        Exit();

                    if (info.getClicked())
                        CurrentGameState = GameState.Info;
            }
Wechsel ich vom Startbildschirm zum Info-Modus und zurück (CurrentGameState ist erneut = GameState.Start), funktioniert nur noch der Beenden-Button, der Info-, und der Startbutton jedoch nicht mehr, beim erstmaligen Aufrufen des "Start"-GameStates stellt dies jedoch kein Problem dar..

Was habe ich falsch gemacht/übersehen?

unter diesem Link könnt ihr das gesamte Projekt runterladen und ausprobieren, XNA Gamestudio ist für das Abspielen jedoch erforderlich!
http://1drv.ms/196g6jM

Gruß
Tech-Nick
 

Hellblazer

Lt. Commander
Dabei seit
Aug. 2011
Beiträge
1.273
States mittels Enumeration? Das schreit doch eigentlich schon nach dem State-Pattern (http://en.wikipedia.org/wiki/State_pattern, oder eben den deutschen Artikel dazu).
Da hat man dann auch keine zig if-Abfragen in zig verschiedenen Methoden und kann damit relativ einfach solche Probleme, wie du gerade hast, umgehen.
 

Kirinkunhime

Ensign
Dabei seit
Juli 2012
Beiträge
185
Ich weiß das klingt sinnlos, aber was passiert wenn du das obige Szenario wiederholst (Vom Startscreen auf Info & Back) und bei deinem Code die ".checkClicks" so anordnest:
Code:
                    start.checkClicks(Mouse.GetState());
                    beenden1.checkClicks(Mouse.GetState());
                    info.checkClicks(Mouse.GetState());
Wenn meine Theorie stimmt, dann sollte jetzt nur der "Start"-Knopf funktionieren.
Falls ich damit richtig liege, dann hängt's irgendwie mit dem .checkClicks zusammen.

(Wobei ich Hellblazer zustimmen muss, dass ein ordentliches State-Pattern da deutlich schöner wäre als ein State-Enum)
 
Zuletzt bearbeitet:

Tech-Nick

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Dez. 2011
Beiträge
498
@Kirinkunhime:
Es ändert sich leider genau nichts.
Wenn ich nach der If-Abfrage für die beiden funktionslosen Knöpfe als Anweisung nicht fordere, den GameState zu ändern sonder ebenfalls "Exit();"
ergänze, beenden auch diese Knöpfe das Spiel..

@Hellblazer:
Vielen Dank, ich sehe es mir an!
Mit einer Switch-Anweisung hat es andere Fehler gegeben..
 

Kirinkunhime

Ensign
Dabei seit
Juli 2012
Beiträge
185
@Tech-Nick: Allgemein würd' ich den ganzen Content der Ifs in eigene Methoden auslagern - würde das ganze sicherlich lesbarer machen als nur mit einer "Wurst" von Update-Methode :)

Allgemein würd' ich dir raten einen Breakpoint in die Zeilen zu schmeißen wo der State auf .GetReady bzw. .Info gesetzt wird und da einfach mit dem Debugger ein wenig durchlaufen.

Aka. das ganze nochmal wiederholen mit dem info clicken & dann beim Breakpoint des State.GetReady guggen ob er vlt. hinterher noch eine andere If Bedingung springt.
Allgemein würd' ich an deiner Stelle ein paar mehr Else-Zweige reinbringen ;) Oder einfach nach jedem größeren If (z.B. dem "CurrentGameState == GameState.Start ) ein "return" reinzuwerfen. Dadurch ersparst dir einige sinnlose If-Abfragen weiter unten :)

LG
Kirin
 
Top