Ajout du système de plugins #5
|
@ -2,6 +2,16 @@
|
|||
Système de gestion d'entités, composants et ressources.
|
||||
"""
|
||||
|
||||
|
||||
__all__ = [
|
||||
"World",
|
||||
"Entity",
|
||||
"Plugin",
|
||||
"Game",
|
||||
]
|
||||
|
||||
|
||||
from abc import abstractmethod
|
||||
from typing import Iterator, Callable, Tuple, TypeVar, Type, Optional
|
||||
from logging import error
|
||||
|
||||
|
@ -225,14 +235,33 @@ class Entity:
|
|||
return True
|
||||
|
||||
|
||||
class Plugin:
|
||||
"""
|
||||
Un plugin qui ajoute des fonctionnalités a un jeu.
|
||||
"""
|
||||
|
||||
@abstractmethod
|
||||
def apply(self, game: "Game") -> None:
|
||||
"""
|
||||
Applique le plugin a un jeu.
|
||||
|
||||
Paramètres:
|
||||
game: Le jeu auquel appliquer le plugin.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
class Game:
|
||||
"""
|
||||
Permet de faire une simple boucle de jeu.
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
def __init__(self, *plugins: Plugin) -> None:
|
||||
"""
|
||||
Créer une un jeu.
|
||||
Créer une un jeu avec les plugins donnés en paramètres.
|
||||
|
||||
Paramètres:
|
||||
*plugins: Les plugins a ajouter au jeu.
|
||||
"""
|
||||
self._running = False
|
||||
self._startup_tasks: list[Callable[[World], None]] = []
|
||||
|
@ -241,6 +270,8 @@ class Game:
|
|||
self._post_update_tasks: list[Callable[[World], None]] = []
|
||||
self._render_tasks: list[Callable[[World], None]] = []
|
||||
self._shutdown_tasks: list[Callable[[World], None]] = []
|
||||
for plugin in plugins:
|
||||
plugin.apply(self)
|
||||
|
||||
def add_startup_tasks(self, *tasks: Callable[[World], None]) -> None:
|
||||
"""
|
40
engine/plugins/timing.py
Normal file
40
engine/plugins/timing.py
Normal file
|
@ -0,0 +1,40 @@
|
|||
"""
|
||||
Définit un plugin qui permet de connaitre le temps depuis de démarage du jeu et le temps depuis la dernière mise a jour.
|
||||
"""
|
||||
|
||||
from engine import *
|
||||
from time import time
|
||||
|
||||
|
||||
class TimePlugin(Plugin):
|
||||
"""
|
||||
Plugin qui permet de connaitre le temps depuis de démarage du jeu et le temps depuis la dernière mise a jour.
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def _initialize_time(world: World) -> None:
|
||||
world.set(Time(time()))
|
||||
|
||||
@staticmethod
|
||||
def _update_time(world: World) -> None:
|
||||
now = time()
|
||||
world.set(Delta(now - world[Time]), Time(now))
|
||||
|
||||
def apply(self, game: Game) -> None:
|
||||
"""
|
||||
Applique le plugin a un jeu.
|
||||
"""
|
||||
game.add_startup_tasks(self._initialize_time)
|
||||
game.add_pre_update_tasks(self._update_time)
|
||||
|
||||
|
||||
class Time(float):
|
||||
"""
|
||||
Ressource qui represente le temps depuis le démarage du jeu.
|
||||
"""
|
||||
|
||||
|
||||
class Delta(float):
|
||||
"""
|
||||
Ressource qui represente le temps depuis la dernière mise a jour.
|
||||
"""
|
6
main.py
6
main.py
|
@ -3,11 +3,12 @@ Ceci est un exemple de comment l'on peut utiliser le moteur du jeu.
|
|||
"""
|
||||
|
||||
|
||||
from engine import Game
|
||||
from engine import *
|
||||
from engine.plugins.timing import TimePlugin, Time
|
||||
|
||||
|
||||
# Initialisation
|
||||
game = Game()
|
||||
game = Game(TimePlugin())
|
||||
|
||||
# Ajout de tache au démarage (l'ordre d'ajout est important)
|
||||
game.add_startup_tasks(lambda world: print("Hello first"))
|
||||
|
@ -17,6 +18,7 @@ game.add_startup_tasks(lambda world: print("Hello last"))
|
|||
|
||||
# Ajoute de tache au mise à jour (malgré le world[Game].stop(), la boucle termine les taches suivantes)
|
||||
game.add_pre_update_tasks(lambda world: print("Pre Update"))
|
||||
game.add_pre_update_tasks(lambda world: print(world[Time]))
|
||||
game.add_update_tasks(lambda world: world[Game].stop())
|
||||
game.add_post_update_tasks(lambda world: print("Post Update"))
|
||||
|
||||
|
|
Loading…
Reference in a new issue