diff --git a/src/engine.py b/src/engine.py index 30460ae..8695f56 100644 --- a/src/engine.py +++ b/src/engine.py @@ -4,10 +4,38 @@ Permet de lancer un jeu et de gérer la boucle principale de celui-ci. from typing import Callable - from ecs import World +class GlobalScene: + """ + Une scène globale du jeu. + + La scène sera executé avant et après la scène actuelle du jeu. + Elle sera aussi executé au démarage et à l'arrêt du jeu. + """ + + def __init__( + self, + init_systems: list[Callable[[World], object]], + pre_update_systems: list[Callable[[World], object]], + post_update_systems: list[Callable[[World], object]], + stop_systems: list[Callable[[World], object]], + ): + self.init_systems = init_systems + self.pre_update_systems = pre_update_systems + self.post_update_systems = post_update_systems + self.stop_systems = stop_systems + + def __add__(self, other: "GlobalScene") -> "GlobalScene": + return GlobalScene( + self.init_systems + other.init_systems, + self.pre_update_systems + other.pre_update_systems, + self.post_update_systems + other.post_update_systems, + self.stop_systems + other.stop_systems, + ) + + class Scene: """ Une scène du jeu. @@ -31,20 +59,22 @@ class Scene: ) -class CurrentScene(str): +class KeepAlive: + """ + Composant qui marque une entité comme n'étant pas détruit lors + d'un changement de scène. + + Si une ressource hérite de cette classe, elle ne sera pas détruite non plus. + """ + + +class CurrentScene(KeepAlive, str): """ Resource qui permet de savoir et de changer la scène actuelle. """ -class KeepAlive: - """ - Composant qui marque une entité comme n'étant pas détruit lors - d'un changement de scène. - """ - - -def start_game(scenes: dict[str, Scene], scene_name: str): +def start_game(global_scene: GlobalScene, scenes: dict[str, Scene], scene_name: str): """ Lance un jeu. @@ -52,8 +82,15 @@ def start_game(scenes: dict[str, Scene], scene_name: str): - `scenes`: un dictionnaire contenant les scènes du jeu. - `scene_name`: le nom de la scène à charger en premier lors du lancement du jeu. """ + # On création du monde world = World() world[CurrentScene] = CurrentScene(scene_name) + + # On initialise la scène globale + for system in global_scene.init_systems: + system(world) + + # Boucle principale scene = scenes.get(scene_name) while scene is not None: # On retire les ressources de l'ancienne scène @@ -71,12 +108,25 @@ def start_game(scenes: dict[str, Scene], scene_name: str): # Tant que la scène n'est pas terminé on la met à jour while world.get(CurrentScene, "") == scene_name: + # On met à jour la scène globale + for system in global_scene.pre_update_systems: + system(world) + + # On met à jour la scène actuelle for system in scene.update_systems: system(world) + # On met à jour la scène globale + for system in global_scene.post_update_systems: + system(world) + # On arrete la scene for system in scene.stop_systems: system(world) # Récupération de la scène suivante scene = scenes.get(world.get(CurrentScene, "")) + + # On arrête la scène globale + for system in global_scene.stop_systems: + system(world)