From 9fe42e16ec77fb9e4c21ac9a67f79a96eb6f15e0 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Sun, 12 Mar 2023 22:37:32 +0100 Subject: [PATCH] Settings scene now use the option object. Fixed an issue where the old FPS settings wouldn't be applied on restart --- main.pyw | 6 ++- source/gui/scene/Settings.py | 26 +++++------- source/gui/window/GameWindow.py | 20 ++++------ source/option/Option.py | 70 ++++++++++++--------------------- 4 files changed, 47 insertions(+), 75 deletions(-) diff --git a/main.pyw b/main.pyw index f298bd4..a7f8289 100644 --- a/main.pyw +++ b/main.pyw @@ -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() diff --git a/source/gui/scene/Settings.py b/source/gui/scene/Settings.py index 9e782f4..1816b20 100644 --- a/source/gui/scene/Settings.py +++ b/source/gui/scene/Settings.py @@ -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( diff --git a/source/gui/window/GameWindow.py b/source/gui/window/GameWindow.py index b60c1f9..8f0677b 100644 --- a/source/gui/window/GameWindow.py +++ b/source/gui/window/GameWindow.py @@ -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() diff --git a/source/option/Option.py b/source/option/Option.py index b25809c..938bc87 100644 --- a/source/option/Option.py +++ b/source/option/Option.py @@ -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