Ich erstelle gerade ein 2D-RPG in C ++ 11 mit Allegro 5 und Boost.
Mein Ziel ist es, meine Spieleinstellungen irgendwie zu aktualisieren, wenn eine Option im Optionsmenü geändert wird. Ich möchte den Benutzer nicht zwingen, mein Spiel neu zu starten. Andere Spiele erfordern keinen Neustart, wenn Sie die Auflösung ändern oder vom Vollbildmodus zum Fenster wechseln. Daher sollte mein Spiel dies auch nicht tun. Nachfolgend finden Sie eine vereinfachte Ansicht des Systems.
Bitte beachten Sie, dass ich mein Spielobjekt nicht unbedingt direkt über den Optionsbildschirm aufrufen möchte. Die gestrichelte Linie soll lediglich den Effekt veranschaulichen, den ich erreichen möchte. um irgendwie ein Update des Spiels zu verursachen, wenn eine Option in einem anderen Teil des Systems geändert wird.
Ausführliche Erklärung
Der ScreenManager enthält eine Liste aller GameScreen
aktuell vorhandenen Objekte. Dies sind verschiedene Bildschirme im Spiel, einschließlich Popups. Dieses Design entspricht mehr oder weniger dem Game State Management-Beispiel in C # / XNA .
Das ScreenManager
enthält einen Verweis auf mein Game
Objekt. Das Game
Objekt initialisiert und ändert die Spieleinstellungen. Wenn ich die Auflösung ändern, den Vollbildmodus aktivieren oder die Lautstärke stummschalten möchte, würde ich dies in der Game
Klasse tun .
Der OptionsScreen kann derzeit jedoch nicht auf die Spielklasse zugreifen. Siehe unteres Diagramm:
Ein GameScreen kann drei Ereignisse signalisieren onFinished
, onTransitionStart
und onTransitionEnd
. Es gibt keine, onOptionsChanged
weil das nur ein Bildschirm tut. Der ScreenManager kann die Ereignisbehandlung dafür nicht einrichten, da er alle Bildschirme als GameScreen
s behandelt.
Meine Frage ist, wie kann ich mein Design so ändern, dass eine Änderung im Optionsmenü keinen Neustart erfordert, sondern sofort geändert wird? Ich würde mein Game
Objekt vorzugsweise zur Aktualisierung auffordern, sobald auf die Schaltfläche "Anwenden" geklickt wird.