Wechsel von Gamestates führt zu Absturz
-
Guten Abend zusammen!
Ich bin seid ein paar Tagen dabei, mich anhand eines Tutorials in C++11 mit SFML 2.1 einzuarbeiten. Soweit klappt das alles auch sehr gut, nur bin ich jetzt bei einem Punkt angelangt, bei dem ich nicht mehr weiter komme.
Folgendes Problem:
Ich schreibe ein Spiel ähnlich dem klassischen Pong. Dabei wird ein Hauptmenü implementiert. Um zwischen Hauptmenü und Spiel wechseln zu können, wird eine abstrakte Klasse erstellt namens Gamestate. So, wenn ich kompiliere und starte, dann sehe ich das Hauptmenü mit Spiel starten und Spiel beenden. Beende ich das Spiel, sehe ich auf meinem Terminal die Nachricht, die ich dem Destruktor der MainMenu-Klasse gegeben habe. Klicke ich auf Spiel starten, sehe ich logischerweise ebenfalls den Mainmenu-Destruktor aber auch den eigentlich Spiel-Destruktor.
Führe ich das Programm direkt im Spiel-Gamestate aus, so sehe ich die ersten obligatorischen Padels und den Ball, welche ich implementiert habe.
Ich verstehe aber nicht, warum ich nicht über das Hauptmenü in mein Spiele-Gamestate gelange. Kann da jemand drüberschauen?
Das wäre sehr nett!Noch ein paar Infos:
OS: Arch Linux x64
IDE: Geany
SFML: 2.1
GCC-Syntax: g++ -pthread -std=c++11 -Wall -o "%e" "%f" Playstate.cpp MainMenuState.cpp Game.cpp -lsfml-audio -lsfml-graphics -lsfml-window -lsfml-system
Link zum Quellcode: http://www.file-upload.net/download-9764541/CyberPong.zip.html
-
if(bStartGameSelected) { game.ChangeState(Game::gameStates::PLAY); } if(bQuitGameSelected) { game.window.close(); game.running = false; }Kann es evtl. sein, dass beide Selected-Bools zur selben Zeit true sind? Teste das mal.
-
Ich habe aus dem zweiten if einfach ein else if gemacht und jetzt funktioniert es!
if(bStartGameSelected) { game.ChangeState(Game::gameStates::PLAY); } else if(bQuitGameSelected) { game.window.close(); game.running = false; }Allerdings frage ich mich, warum das bei zwei if nicht funktioniert... müsste doch eigentlich auch funktionieren

-
Du initialisierst
bStartGameSelectedundbQuitGameSelectednicht. DeshalbISO/IEC 14882:2011 (n3337) schrieb:
§8.5.11 If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. [...]
werden sie default-initialized, was
ISO/IEC 14882:2011 (n3337) schrieb:
§8.5.6 To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor forTis called (and the initialization is ill-formed ifThas no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed.bedeutet.
Die beiden booleans haben also den Wert, der zufällig an der Speicherstelle steht, an der sie zu liegen kommen. Das ist mit viel größerer Wahrscheinlichkeit != 0 alsotrue. Was passiert, wenn im folgenden beideboolstruesind?bool a = true; bool b = true; if(a) { game.ChangeState(Game::gameStates::PLAY); } if(b) { game.window.close(); game.running = false; }