Komischer Fehler



  • Hi Leute könnte mal euren rat brauchen.

    Ich bin an einem Spiel dran welches ich in Gamestates eingeteilt habe und zwar wie folgt.

    while(Gamestate != 0)
    {
        if(Gamestate == 1)
        {
              CHauptmenue Hauptmenue;
              Hauptmenue.Hauptmenuemodus(&App,&Gamestate);
        }
        if(Gamestate == 2)
        {
            CSpiel Spiel(App);
            Spiel.Spiel(&Gamestate);
        }
    }
    

    Das Programm wird zu Beginn auf Gamestate 1 gesetzt.
    Hauptmenü wird korrekt dargestellt. ich klicke im Hauptmenü auf Neues Spiel, beende so die schleife des Hauptmenüs und anschliessend wird der Gamestate auf 2 Gesetzt.

    Dort wird ein Spiel anelegt.

    in Spiel ist eine Gameschleife.
    Diese wird mit bool Running aufrecht gehalten.

    while(Gamerunning == True)
    {
      Eventabfrage();
      Mausabfrage();
    
      //code für spiel
    }
    
    // hier wird der gamestate wieder auf eins gesetzt
    

    So wenn das Spiel Gestartet wurde habe ich 2 Möglichkeiten es zu beenden.
    Die erste wenn die Escape taste gedrückt wurde. Die Zweite wenn ein button im Spiel gedrückt wurde.
    Beide Möglichkeiten setzen bool Gamerunning auf False.
    und nach der Spielschleife wird über den Gamestate ins Hauptmenü gesprungen.

    Nun zum Fehler:

    Wenn ich das Spiel über Esacape beende, was in der Eventabfrage behandelt wird,
    wird Gamerunning auf False gesetzt.Spielschleiffe wird beendet. Es geht zurück in Hauptmenü und ich kann ein NeuesSpiel starten.!!! Funktioniert!!!

    Wenn ich aber mit der Maus Auf meinen angelegten Button klicke wird Gamerunning false gesetzt. Spielschleife wird beendet. Es geht ins Hauptmenü. Klicke ich nun auf Neues Spiel Flackert kurz Das Spiel auf und gleich dannach wieder das Hauptmenü.Es lässt sich kein Spiel öffnen.

    Der Knopf der zum beenden da ist abzufragen ist funktioniert und es passiert dannach das selbe als wenn ich escape drücke nur das bei letzterem eben das Spiel sich n icht mehr öffnen lässt.

    Jemand ne Idee



  • Das einzige was mir da einfallen würde wäre das du deinen Button nicht zurücksetzt. So wie sich das anhört hast du den Button ja komplett selbst gemacht (also keine WinAPI usw). Dein Fehler klingt so als wenn du den Button alle paar Frames prüfst und ihn schlicht nicht zurücksetzt nachdem er einmal gedrückt war, dh einmal gedrückt imer gedrückt und somit das Spiel sich nach dem Starten direkt wieder beendet.



  • naja über sfml lege ich einen bereichim bild fest wo ich hinklicken muss.
    ich frage in jedem frame ab wo der masuzeiger ist. ist der masuzeiger innerhalb des bereiches frage ich ob links gedrückt wurde. wenn ja wird Game running auf false gesetzt.

    aber all das passiert in dem objekt spiel. wenn gamestate wieder auf 1 gesetzt wird müsste sich ja das Objekt spiel wieder löschen. weil es ja nicht mehr da ist es wird ja nur in der if abfrage zu gamestate 2 erzeugt. mir ist aber aufgefallen das wenn ich auf neues spiel klicke und gedrückt halte und von dem button runter gehe das dann das fenster aufgeht. aber wie gesagt bei escape geht das ganz normal.



  • Ich weiss nicht ob und wie das bei SFML funktioniert, aber wenn ich OpenGL benutze unter Windows allokiere ich mir immer eine Konsole zusätzlich um Outputs zu machen oder erstelle recht umfangreiche Logbücher in XML die ich mit einem eigenen Tool analyisieren kann.
    Eventuell solltest Du einen ähnlichen Mechanismus integrieren mit dem Du den Gamestate überwachen kannst und so feststellen kannst wann, wo und weswegen sich der Gamestate ändert.
    Solche Mechanismen sollten bei Spielen immer bedacht werden, denn Spiele sind nicht leicht zu debuggen bzw der normale Debugger bringt nur teilweise etwas, da manche Operationen ja "zeitkritisch" sind bzw das Timing durcheinander kommt etc.
    rya.



  • Danke für den Tip mit dem cout der Werte.
    Habs geschaft 😃 .

    Ich konnte den Fehler eingrenzen und weiss nun woran es gelegen hatt.
    Ich speichere bei jeder Mausbewegung die xy Koordinaten wenn ich auf den Button geklickt habe wurden die Koordinaten gespeichert.
    Ich bin wieder im Hauptmenü gelandet. Dort habe ich dann auf neues Spiel geklickt da ich die Maus nicht bewege werden ,wärend des Klicks, die xy Koordinten nicht umgesetzt und desshalb denkt er die Maus steht noch auf dem Button und es wird gleich wieder bestätigt das das spiel beendet werden soll.

    Umgangen habe ich das indem ich im Konstruktor die Koordinaten auf 0 gestezt habe. Eigentlich müsste das Objekt Spiel gelöscht werden nachdem ich den Gamestate verlasse.
    Um so erstaunlicher finde ich das bei einem erneuten Anlegen genau die selben Speicheradressen verwendet werden. kann mann eigentlich über cout auch Prüfen ob der Destruktor aufgerufen wurde? Ich habs schon versucht einen cout im Konstruktor zu platzieren aber da meckert der Compiler.


Anmelden zum Antworten