Ajout du système de plugins #5
|
@ -2,6 +2,16 @@
|
||||||
Système de gestion d'entités, composants et ressources.
|
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 typing import Iterator, Callable, Tuple, TypeVar, Type, Optional
|
||||||
from logging import error
|
from logging import error
|
||||||
|
|
||||||
|
@ -225,14 +235,33 @@ class Entity:
|
||||||
return True
|
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:
|
class Game:
|
||||||
"""
|
"""
|
||||||
Permet de faire une simple boucle de jeu.
|
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._running = False
|
||||||
self._startup_tasks: list[Callable[[World], None]] = []
|
self._startup_tasks: list[Callable[[World], None]] = []
|
||||||
|
@ -241,6 +270,8 @@ class Game:
|
||||||
self._post_update_tasks: list[Callable[[World], None]] = []
|
self._post_update_tasks: list[Callable[[World], None]] = []
|
||||||
self._render_tasks: list[Callable[[World], None]] = []
|
self._render_tasks: list[Callable[[World], None]] = []
|
||||||
self._shutdown_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:
|
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
|
# Initialisation
|
||||||
game = Game()
|
game = Game(TimePlugin())
|
||||||
|
|
||||||
# Ajout de tache au démarage (l'ordre d'ajout est important)
|
# Ajout de tache au démarage (l'ordre d'ajout est important)
|
||||||
game.add_startup_tasks(lambda world: print("Hello first"))
|
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)
|
# 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("Pre Update"))
|
||||||
|
game.add_pre_update_tasks(lambda world: print(world[Time]))
|
||||||
game.add_update_tasks(lambda world: world[Game].stop())
|
game.add_update_tasks(lambda world: world[Game].stop())
|
||||||
game.add_post_update_tasks(lambda world: print("Post Update"))
|
game.add_post_update_tasks(lambda world: print("Post Update"))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue