Ajout du système de plugins #5

Merged
tipragot merged 2 commits from plugins into main 2023-10-24 12:37:43 +00:00
3 changed files with 77 additions and 4 deletions

View file

@ -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
View 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.
"""

View file

@ -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"))