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)
|
||||
- mode d'emploi (video + pdf) expliquant le fonctionnement
|
||||
|
||||
2. Visuel :
|
||||
2. Bonus :
|
||||
- animations de fin, mettre la musique, ...
|
||||
- sauvegarder les paramètres dans un fichier
|
||||
- Voir les TODOs
|
||||
|
||||
3. Bug :
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import itertools
|
||||
from math import inf
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import pyglet.app
|
||||
|
@ -46,7 +48,7 @@ class Settings(Popup):
|
|||
)
|
||||
|
||||
self.fullscreen.add_listener(
|
||||
"on_click_release",
|
||||
"on_state_change",
|
||||
lambda widget, *_: self.window.set_fullscreen(widget.state)
|
||||
)
|
||||
|
||||
|
@ -72,7 +74,7 @@ class Settings(Popup):
|
|||
)
|
||||
|
||||
self.vsync.add_listener(
|
||||
"on_click_release",
|
||||
"on_state_change",
|
||||
lambda widget, *_: self.window.set_vsync(widget.state)
|
||||
)
|
||||
|
||||
|
@ -98,7 +100,7 @@ class Settings(Popup):
|
|||
)
|
||||
|
||||
self.show_fps.add_listener(
|
||||
"on_click_release",
|
||||
"on_state_change",
|
||||
lambda widget, *_: self.window.set_fps_enabled(widget.state)
|
||||
)
|
||||
|
||||
|
@ -120,26 +122,15 @@ class Settings(Popup):
|
|||
|
||||
style=texture.Scroller.Style1,
|
||||
from_=1,
|
||||
value=60,
|
||||
value=fps if (fps := self.window.get_fps()) <= 240 else 250,
|
||||
to=250,
|
||||
|
||||
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(
|
||||
"on_value_change",
|
||||
change_fps
|
||||
lambda widget, *_: self.window.set_fps(widget.value if widget.value <= 240 else inf)
|
||||
)
|
||||
|
||||
self.add_widget(
|
||||
|
|
|
@ -21,7 +21,7 @@ class GameWindow(Window): # NOQA
|
|||
self._fps_enable = fps_enable
|
||||
|
||||
@property
|
||||
def fps_enable(self):
|
||||
def fps_enable(self) -> bool:
|
||||
return self._fps_enable
|
||||
|
||||
def set_fps_enabled(self, value: bool):
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import itertools
|
||||
from math import inf
|
||||
from typing import Type, TYPE_CHECKING
|
||||
|
||||
import pyglet
|
||||
|
@ -24,6 +26,40 @@ class Window(pyglet.window.Window, EventPropagationMixin): # NOQA
|
|||
def childs(self):
|
||||
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
|
||||
|
||||
def set_scene(self, scene_class: Type["Scene"], *scene_args, **scene_kwargs) -> "Scene":
|
||||
|
|
Loading…
Reference in a new issue