Settings scene now use the option object. Fixed an issue where the old FPS settings wouldn't be applied on restart

This commit is contained in:
Faraphel 2023-03-12 22:37:32 +01:00
parent 095b956ed7
commit 9fe42e16ec
4 changed files with 47 additions and 75 deletions

View file

@ -27,5 +27,9 @@ except: pass # NOQA E722
window.set_minimum_size(720, 480)
window.add_scene(MainMenu)
# Start the event loop
# Créer un événement juste après le debut de la boucle pour charger les options.
# Puisque pyglet.app.run va limiter les FPS à 60, les options doivent être chargées juste après
# afin que les anciens paramètres de FPS soient appliqués.
pyglet.clock.schedule_once(lambda *_: window.load_option(), 0)
# Démarre la boucle d'événement
pyglet.app.run()

View file

@ -72,12 +72,12 @@ class Settings(Popup):
style=texture.Checkbox.Style1,
state=self.window.vsync
state=self.window.option.get_vsync()
)
self.vsync.add_listener(
"on_state_change",
lambda widget, *_: self.window.set_vsync(widget.state)
lambda widget, *_: self.window.option.set_vsync(widget.state)
)
self.add_widget(
@ -98,12 +98,12 @@ class Settings(Popup):
style=texture.Checkbox.Style1,
state=self.window.fps_enable
state=self.window.option.get_fps_show()
)
self.show_fps.add_listener(
"on_state_change",
lambda widget, *_: self.window.set_fps_enabled(widget.state)
lambda widget, *_: self.window.option.set_fps_show(widget.state)
)
self.add_widget(
@ -124,7 +124,7 @@ class Settings(Popup):
style=texture.Scroller.Style1,
from_=1,
value=fps if (fps := self.window.get_fps()) <= 240 else 250,
value=fps if (fps := self.window.option.get_fps_limit()) <= 240 else 250,
to=250,
text_transform=lambda value: round(value) if value <= 240 else "Illimité"
@ -132,7 +132,7 @@ class Settings(Popup):
self.fps_limit.add_listener(
"on_value_change",
lambda widget, *_: self.window.set_fps(widget.value if widget.value <= 240 else inf)
lambda widget, *_: self.window.option.set_fps_limit(widget.value if widget.value <= 240 else inf)
)
self.add_widget(
@ -153,18 +153,15 @@ class Settings(Popup):
style=texture.Scroller.Style1,
from_=0,
value=media.SoundEffect.get_volume(),
value=self.window.option.get_volume_fx(),
to=1,
text_transform=lambda value: f"{round(value * 100)}%"
)
def change_volume_sfx(widget):
media.SoundEffect.set_volume(widget.value)
self.volume_sfx.add_listener(
"on_value_change",
change_volume_sfx
lambda widget, *_: self.window.option.set_volume_fx(widget.value)
)
self.add_widget(
@ -185,18 +182,15 @@ class Settings(Popup):
style=texture.Scroller.Style1,
from_=0,
value=media.SoundAmbient.get_volume(),
value=self.window.option.get_volume_ambient(),
to=1,
text_transform=lambda value: f"{round(value * 100)}%"
)
def change_volume_ambient(widget):
media.SoundAmbient.set_volume(widget.value)
self.volume_ambient.add_listener(
"on_value_change",
change_volume_ambient
lambda widget, *_: self.window.option.set_volume_ambient(widget.value)
)
self.add_widget(

View file

@ -23,25 +23,19 @@ class GameWindow(Window): # NOQA
super().__init__(*args, **kwargs)
self._fps_counter = pyglet.window.FPSDisplay(self, color=fps_color)
self._fps_enable = fps_enable
self.fps_enable = fps_enable
self.option = None
self.option_path = option_path
def load_option(self):
try:
if option_path.exists():
self.option = Option.load(self, option_path)
if self.option_path.exists():
self.option = Option.load(self, self.option_path)
except Exception: # NOQA
pass
if self.option is None:
self.option = Option(window=self)
@property
def fps_enable(self) -> bool:
return self._fps_enable
def set_fps_enabled(self, value: bool):
self._fps_enable = value
if self.option is None: self.option = Option(window=self)
def on_draw_after(self):
if self._fps_enable: self._fps_counter.draw()
if self.fps_enable: self._fps_counter.draw()

View file

@ -17,63 +17,43 @@ class Option:
vsync: bool = True
):
self.window = window
self.volume_ambient = volume_ambient
self.volume_fx = volume_fx
self.fps_show = fps_show
self.fps_limit = fps_limit
self.vsync = vsync
self.set_volume_ambient(volume_ambient)
self.set_volume_fx(volume_fx)
self.set_fps_show(fps_show)
self.set_fps_limit(fps_limit)
self.set_vsync(vsync)
# propriété
@property
def volume_ambient(self) -> float:
return media.SoundAmbient.get_volume()
@staticmethod
def get_volume_ambient() -> float: return media.SoundAmbient.get_volume()
@staticmethod
def set_volume_ambient(value: float): media.SoundAmbient.set_volume(value)
@volume_ambient.setter
def volume_ambient(self, value: float):
media.SoundAmbient.set_volume(value)
@staticmethod
def get_volume_fx() -> float: return media.SoundEffect.get_volume()
@staticmethod
def set_volume_fx(value: float): media.SoundEffect.set_volume(value)
@property
def volume_fx(self) -> float:
return media.SoundEffect.get_volume()
def get_fps_show(self): return self.window.fps_enable
def set_fps_show(self, value: bool): self.window.fps_enable = value
@volume_fx.setter
def volume_fx(self, value: float):
media.SoundEffect.set_volume(value)
def get_fps_limit(self): return self.window.get_fps()
def set_fps_limit(self, value: float): self.window.set_fps(value)
@property
def fps_show(self):
return self.window.fps_enable
@fps_show.setter
def fps_show(self, value: bool):
self.window.set_fps_enabled(value)
@property
def fps_limit(self):
return self.window.get_fps()
@fps_limit.setter
def fps_limit(self, value: float):
self.window.set_fps(value)
@property
def vsync(self):
return self.window.vsync
@vsync.setter
def vsync(self, value: bool):
self.window.set_vsync(value)
def get_vsync(self): return self.window.vsync
def set_vsync(self, value: bool): self.window.set_vsync(value)
# chargement et sauvegarde
def to_json(self) -> dict:
return {
"volume_ambient": self.volume_ambient,
"volume_fx": self.volume_fx,
"fps_show": self.fps_show,
"fps_limit": self.fps_limit,
"vsync": self.vsync,
"volume_ambient": self.get_volume_ambient(),
"volume_fx": self.get_volume_fx(),
"fps_show": self.get_fps_show(),
"fps_limit": self.get_fps_limit(),
"vsync": self.get_vsync(),
}
@classmethod