moved the fps counter from a widget to the GameWindow features, window can now react to event after all scenes got their corresponding event called by adding "_after" in the name of the method event
This commit is contained in:
parent
446e377b19
commit
15161764ad
10 changed files with 46 additions and 56 deletions
25
NOTE.md
25
NOTE.md
|
@ -1,22 +1,5 @@
|
||||||
A faire :
|
A faire :
|
||||||
Widgets:
|
- Optimiser les textures dans un dictionnaires
|
||||||
- Grille (bataille navale)
|
- Optimiser les textures similaire dans un atlas
|
||||||
|
- Toutes les scènes devrait proposer un compteur de fps
|
||||||
|
- Permettre de forcer la taille de la fenêtre à un ratio
|
||||||
|
|
||||||
Réseau :
|
|
||||||
|
|
||||||
- Connexion entre les joueurs
|
|
||||||
- Envoie des paramètres à l'autre joueur (largeur longueur du plateau, nombre de bateau et leur taille, ...)
|
|
||||||
- Phase de placement des bateaux
|
|
||||||
- Confirmer l'emplacement des bateaux (envoie des données signalant la confirmation)
|
|
||||||
|
|
||||||
- Joueur 1 sélectionne une case (envoie des données à l'autre joueur)
|
|
||||||
- Joueur 2 envoie la valeur de retour de board.bomb après les données de joueur 1
|
|
||||||
- Joueur 2 sélectionne une case
|
|
||||||
- Joueur 1 envoie la valeur de retour également
|
|
||||||
...
|
|
||||||
|
|
||||||
- Joueur 1 gagne (envoie des données de victoire à l'autre joueur)
|
|
||||||
- Joueur 1 et Joueur 2 s'envoie mutuellement leurs plateaux pour voir les cases restantes de l'autre
|
|
||||||
- Proposition de rejouer ?
|
|
||||||
|
|
4
main.pyw
4
main.pyw
|
@ -1,11 +1,11 @@
|
||||||
import pyglet
|
import pyglet
|
||||||
|
|
||||||
from source.gui.scene import MainMenu
|
from source.gui.scene import MainMenu
|
||||||
from source.gui.window import Window
|
from source.gui.window import GameWindow
|
||||||
|
|
||||||
|
|
||||||
# Create a new window
|
# Create a new window
|
||||||
window = Window(resizable=True, vsync=True)
|
window = GameWindow(resizable=True, vsync=True)
|
||||||
window.add_scene(MainMenu)
|
window.add_scene(MainMenu)
|
||||||
|
|
||||||
# Start the event loop
|
# Start the event loop
|
||||||
|
|
|
@ -4,7 +4,6 @@ import pyglet
|
||||||
|
|
||||||
from source.gui.scene.abc import Scene
|
from source.gui.scene.abc import Scene
|
||||||
from source.gui import widget, scene
|
from source.gui import widget, scene
|
||||||
from source.gui.widget.debug import FPSDisplay
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from source.gui.window import Window
|
from source.gui.window import Window
|
||||||
|
@ -77,13 +76,9 @@ class MainMenu(Scene):
|
||||||
|
|
||||||
self.settings.add_listener("on_click_release", lambda *_: self.window.set_scene(scene.Settings))
|
self.settings.add_listener("on_click_release", lambda *_: self.window.set_scene(scene.Settings))
|
||||||
|
|
||||||
self.fps_display = self.add_widget(FPSDisplay, color=(255, 255, 255, 180))
|
|
||||||
|
|
||||||
def on_draw(self):
|
def on_draw(self):
|
||||||
self.background.draw()
|
self.background.draw()
|
||||||
self.title.draw()
|
self.title.draw()
|
||||||
self.game_create.draw()
|
self.game_create.draw()
|
||||||
self.game_join.draw()
|
self.game_join.draw()
|
||||||
self.settings.draw()
|
self.settings.draw()
|
||||||
|
|
||||||
self.fps_display.draw()
|
|
||||||
|
|
|
@ -24,9 +24,9 @@ class Scene(ABC):
|
||||||
def add_widget(self, widget_class: Type["Widget"], **widget_kwargs):
|
def add_widget(self, widget_class: Type["Widget"], **widget_kwargs):
|
||||||
"""
|
"""
|
||||||
Add a widget to the scene.
|
Add a widget to the scene.
|
||||||
:widget_class: the class of the widget to add.
|
:param widget_class: the class of the widget to add.
|
||||||
:widget_args: args for the creation of the widget object.
|
:param widget_args: args for the creation of the widget object.
|
||||||
:widget_kwargs: kwargs for the creation of the widget object.
|
:param widget_kwargs: kwargs for the creation of the widget object.
|
||||||
:return: the new created widget.
|
:return: the new created widget.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ class Scene(ABC):
|
||||||
def remove_widget(self, widget: "Widget") -> None:
|
def remove_widget(self, widget: "Widget") -> None:
|
||||||
"""
|
"""
|
||||||
Remove a widget from the scene.
|
Remove a widget from the scene.
|
||||||
:scene: the widget to remove.
|
:param scene: the widget to remove.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self._widgets.remove(widget)
|
self._widgets.remove(widget)
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
from source.gui.widget.abc import Widget
|
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
import pyglet
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from source.gui.scene.abc import Scene
|
|
||||||
|
|
||||||
|
|
||||||
class FPSDisplay(Widget):
|
|
||||||
"""
|
|
||||||
A widget that display the current FPS of the scene's window
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, scene: "Scene", **kwargs):
|
|
||||||
super().__init__(scene)
|
|
||||||
|
|
||||||
self.fps_display = pyglet.window.FPSDisplay(scene.window, **kwargs)
|
|
||||||
|
|
||||||
def draw(self):
|
|
||||||
self.fps_display.draw()
|
|
|
@ -1 +0,0 @@
|
||||||
from .FPSDisplay import FPSDisplay
|
|
24
source/gui/window/GameWindow.py
Normal file
24
source/gui/window/GameWindow.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import pyglet.window
|
||||||
|
|
||||||
|
from source.gui.window import Window
|
||||||
|
from source.type import Color
|
||||||
|
|
||||||
|
|
||||||
|
class GameWindow(Window): # NOQA
|
||||||
|
"""
|
||||||
|
Similar to the normal Window, but add small feature useful for a game like a fps counter.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
|
||||||
|
fps_color: Color = (255, 255, 255, 200),
|
||||||
|
fps_enable: bool = True,
|
||||||
|
|
||||||
|
*args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
self._fps_counter = pyglet.window.FPSDisplay(self, color=fps_color)
|
||||||
|
self.fps_enable = fps_enable
|
||||||
|
|
||||||
|
def on_draw_after(self):
|
||||||
|
if self.fps_enable: self._fps_counter.draw()
|
|
@ -76,15 +76,24 @@ class Window(pyglet.window.Window): # NOQA
|
||||||
:return: une fonction appelant l'événement original ainsi que ceux des scènes.
|
:return: une fonction appelant l'événement original ainsi que ceux des scènes.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# try to get the original function
|
||||||
func = None
|
func = None
|
||||||
try: func = super().__getattribute__(item)
|
try: func = super().__getattribute__(item)
|
||||||
except AttributeError: pass
|
except AttributeError: pass
|
||||||
|
|
||||||
|
# try to get a function that would get executed after everything else
|
||||||
|
func_after = None
|
||||||
|
try: func_after = super().__getattribute__(item + "_after")
|
||||||
|
except AttributeError: pass
|
||||||
|
|
||||||
def _func(*args, **kwargs) -> None:
|
def _func(*args, **kwargs) -> None:
|
||||||
if func is not None: func(*args, **kwargs)
|
if func is not None: func(*args, **kwargs)
|
||||||
|
|
||||||
for scene in self._scenes:
|
for scene in self._scenes:
|
||||||
getattr(scene, item)(*args, **kwargs)
|
getattr(scene, item)(*args, **kwargs)
|
||||||
|
|
||||||
|
if func_after is not None: func_after(*args, **kwargs)
|
||||||
|
|
||||||
return _func
|
return _func
|
||||||
|
|
||||||
def __getattribute__(self, item: str) -> Any:
|
def __getattribute__(self, item: str) -> Any:
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
from .Window import Window
|
from .Window import Window
|
||||||
|
from .GameWindow import GameWindow
|
||||||
|
|
|
@ -3,7 +3,8 @@ from typing import Union, Callable, Any
|
||||||
Point2D = tuple[int, int]
|
Point2D = tuple[int, int]
|
||||||
BBox = tuple[int, int, int, int]
|
BBox = tuple[int, int, int, int]
|
||||||
Percentage = float # a percentage, represented as a number between 0 and 1
|
Percentage = float # a percentage, represented as a number between 0 and 1
|
||||||
|
Color = tuple[int, int, int, int]
|
||||||
|
|
||||||
DistanceFunction = Callable[[Any], int] # a function that return a distance
|
DistanceFunction = Callable[[Any], int] # a function that return a distance
|
||||||
# a distance, represented either by a whole number, a percentage or a function
|
# a distance, represented either by a whole number, a percentage or a function
|
||||||
Distance = Union[Percentage, int, DistanceFunction]
|
Distance = Union[Percentage, int, DistanceFunction]
|
Loading…
Reference in a new issue