Optionsmenü mit Grafikeinstellungen in Godot
Warum Grafikeinstellungen zur Laufzeit nicht übernommen wurden. Ich bearbeite gerade die 20 Games Challenge, in der man 20 kleine Spiele bauen soll, um verschiedene Aspekte der Spieleentwicklung zu lernen. Das Konzept, einen festen Scope zu haben und an kleinen Projekten zu entwickeln, hat mich überzeugt. Mein Ansatz weicht aber in einigen Punkten ab, da ich mich gerne in Details verliere und mir gewisse Dinge ins Auge springen, die ich unbedingt umsetzen möchte. Ich bin gerade bei Spiel 3 und baue einen Frogger-Clon. Anders als in der Challenge vorgegeben baue ich allerdings ein 3D-Spiel und wollte ein Options-Menü bauen, in dem zur Laufzeit Qualitätseinstellungen ausgewählt werden können. Diese sollten über mehrere Spielestarts persistiert werden. Ein Beispiel für eine Einstellung ist MSAA 3D (3D Multisample Anti-Aliasing). Die Auswahl einer Option im OptionButton hat dann ein Signal ausgelöst, das im Code des Dialogfensters etwa folgendermaßen behandelt wurde: Die Auswahl einer Option hatte allerdings keinen Effekt, ich konnte kein Anti-Aliasing im Spiel beobachten, die FPS blieben konstant und auch die Auslastung der Grafikkarte änderte sich nicht. Ich hatte sogar meinen Code mit dem „graphics_settings“ Projekt aus dem godot-demo-projects Repo verglichen und konnte keinen offensichtlichen Unterschied feststellen. Der Code in Nach einer Menge Debugging und dem Ausschluss aller anderen Optionen kam ich dann darauf: Mein Options-Dialog war, im Gegensatz zu dem Demo-Projekt, in einem eigenen Fenster. Die Klasse Window erbt von Viewport, was dazu geführt hat, dass mein Code nur die Einstellungen des Options-Fensters geändert hat. Mein Fix bestand darin, statt # [...]
# [...]
.
.
.
.
.
.
.msaa_3d = (index as MSAA)
# [...]
_on_msaa_option_button_item_selected
ruft auch get_viewport().msaa_3d = ...
auf. index
entsprach dem korrekten Wert aus dem Viewport.MSAA
-enum, den ich zum Testen sogar nach MSAA
gecastet hatte1.get_viewport()
eine eigene Funktion zu bauen, die den Root-Viewport ermittelt und diese stattdessen zu verwenden:
return ..