implemented settings
This commit is contained in:
parent
5ca7ed5195
commit
e3a67eff6a
4 changed files with 46 additions and 18 deletions
3
NOTE.md
3
NOTE.md
|
@ -6,8 +6,9 @@ A faire :
|
||||||
- test avec "assert" (cahier des charges)
|
- test avec "assert" (cahier des charges)
|
||||||
- mode d'emploi (video + pdf) expliquant le fonctionnement
|
- mode d'emploi (video + pdf) expliquant le fonctionnement
|
||||||
|
|
||||||
2. Visuel :
|
2. Bonus :
|
||||||
- animations de fin, mettre la musique, ...
|
- animations de fin, mettre la musique, ...
|
||||||
|
- sauvegarder les paramètres dans un fichier
|
||||||
- Voir les TODOs
|
- Voir les TODOs
|
||||||
|
|
||||||
3. Bug :
|
3. Bug :
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import itertools
|
||||||
|
from math import inf
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import pyglet.app
|
import pyglet.app
|
||||||
|
@ -46,7 +48,7 @@ class Settings(Popup):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.fullscreen.add_listener(
|
self.fullscreen.add_listener(
|
||||||
"on_click_release",
|
"on_state_change",
|
||||||
lambda widget, *_: self.window.set_fullscreen(widget.state)
|
lambda widget, *_: self.window.set_fullscreen(widget.state)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -72,7 +74,7 @@ class Settings(Popup):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.vsync.add_listener(
|
self.vsync.add_listener(
|
||||||
"on_click_release",
|
"on_state_change",
|
||||||
lambda widget, *_: self.window.set_vsync(widget.state)
|
lambda widget, *_: self.window.set_vsync(widget.state)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -98,7 +100,7 @@ class Settings(Popup):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.show_fps.add_listener(
|
self.show_fps.add_listener(
|
||||||
"on_click_release",
|
"on_state_change",
|
||||||
lambda widget, *_: self.window.set_fps_enabled(widget.state)
|
lambda widget, *_: self.window.set_fps_enabled(widget.state)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -120,26 +122,15 @@ class Settings(Popup):
|
||||||
|
|
||||||
style=texture.Scroller.Style1,
|
style=texture.Scroller.Style1,
|
||||||
from_=1,
|
from_=1,
|
||||||
value=60,
|
value=fps if (fps := self.window.get_fps()) <= 240 else 250,
|
||||||
to=250,
|
to=250,
|
||||||
|
|
||||||
text_transform=lambda value: round(value) if value <= 240 else "Illimité"
|
text_transform=lambda value: round(value) if value <= 240 else "Illimité"
|
||||||
)
|
)
|
||||||
|
|
||||||
def change_fps(widget):
|
|
||||||
pyglet.clock.unschedule(pyglet.app.event_loop._redraw_windows) # NOQA
|
|
||||||
|
|
||||||
if widget.value <= 240:
|
|
||||||
pyglet.clock.schedule_interval(
|
|
||||||
pyglet.app.event_loop._redraw_windows, # NOQA
|
|
||||||
1 / widget.value
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
pyglet.clock.schedule(pyglet.app.event_loop._redraw_windows) # NOQA
|
|
||||||
|
|
||||||
self.fps_limit.add_listener(
|
self.fps_limit.add_listener(
|
||||||
"on_value_change",
|
"on_value_change",
|
||||||
change_fps
|
lambda widget, *_: self.window.set_fps(widget.value if widget.value <= 240 else inf)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.add_widget(
|
self.add_widget(
|
||||||
|
|
|
@ -21,7 +21,7 @@ class GameWindow(Window): # NOQA
|
||||||
self._fps_enable = fps_enable
|
self._fps_enable = fps_enable
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def fps_enable(self):
|
def fps_enable(self) -> bool:
|
||||||
return self._fps_enable
|
return self._fps_enable
|
||||||
|
|
||||||
def set_fps_enabled(self, value: bool):
|
def set_fps_enabled(self, value: bool):
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import itertools
|
||||||
|
from math import inf
|
||||||
from typing import Type, TYPE_CHECKING
|
from typing import Type, TYPE_CHECKING
|
||||||
|
|
||||||
import pyglet
|
import pyglet
|
||||||
|
@ -24,6 +26,40 @@ class Window(pyglet.window.Window, EventPropagationMixin): # NOQA
|
||||||
def childs(self):
|
def childs(self):
|
||||||
return self._scenes
|
return self._scenes
|
||||||
|
|
||||||
|
# FPS
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_fps() -> float:
|
||||||
|
# on récupère la fonction responsable du rafraichissement de la fenêtre
|
||||||
|
refresh_func = pyglet.app.event_loop._redraw_windows # NOQA
|
||||||
|
|
||||||
|
# on récupère l'événement correspondant dans l'horloge de l'application
|
||||||
|
refresh_event = next(filter(
|
||||||
|
lambda item: item.func is refresh_func,
|
||||||
|
itertools.chain(
|
||||||
|
pyglet.clock._default._schedule_interval_items, # NOQA
|
||||||
|
pyglet.clock._default._schedule_items # NOQA
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
# renvoie infini s'il n'y avait pas de fréquence, sinon 1 / fréquence pour avoir le nombre de FPS
|
||||||
|
return inf if isinstance(refresh_event, pyglet.clock._ScheduledItem) else 1 / refresh_event.interval # NOQA
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def set_fps(value: float):
|
||||||
|
# on récupère la fonction responsable du rafraichissement de la fenêtre
|
||||||
|
refresh_func = pyglet.app.event_loop._redraw_windows # NOQA
|
||||||
|
|
||||||
|
# désactive le rafraichissement de la fenêtre
|
||||||
|
pyglet.clock.unschedule(refresh_func)
|
||||||
|
|
||||||
|
if value == inf:
|
||||||
|
# si la valeur est infinie, rafraichi dès que possible
|
||||||
|
pyglet.clock.schedule(refresh_func)
|
||||||
|
else:
|
||||||
|
# sinon rafraichi à la fréquence indiquée (1 / FPS)
|
||||||
|
pyglet.clock.schedule_interval(refresh_func, 1 / value)
|
||||||
|
|
||||||
# Scene Managing
|
# Scene Managing
|
||||||
|
|
||||||
def set_scene(self, scene_class: Type["Scene"], *scene_args, **scene_kwargs) -> "Scene":
|
def set_scene(self, scene_class: Type["Scene"], *scene_args, **scene_kwargs) -> "Scene":
|
||||||
|
|
Loading…
Reference in a new issue