Ajout d'une scène globale

This commit is contained in:
Tipragot 2023-10-31 14:22:42 +01:00
parent 2bb643e3fe
commit fbcecccf7d

View file

@ -4,10 +4,38 @@ Permet de lancer un jeu et de gérer la boucle principale de celui-ci.
from typing import Callable from typing import Callable
from ecs import World 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: class Scene:
""" """
Une scène du jeu. 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. Resource qui permet de savoir et de changer la scène actuelle.
""" """
class KeepAlive: def start_game(global_scene: GlobalScene, scenes: dict[str, Scene], scene_name: str):
"""
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):
""" """
Lance un jeu. 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. - `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. - `scene_name`: le nom de la scène à charger en premier lors du lancement du jeu.
""" """
# On création du monde
world = World() world = World()
world[CurrentScene] = CurrentScene(scene_name) 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) scene = scenes.get(scene_name)
while scene is not None: while scene is not None:
# On retire les ressources de l'ancienne scène # 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 # Tant que la scène n'est pas terminé on la met à jour
while world.get(CurrentScene, "") == scene_name: 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: for system in scene.update_systems:
system(world) system(world)
# On met à jour la scène globale
for system in global_scene.post_update_systems:
system(world)
# On arrete la scene # On arrete la scene
for system in scene.stop_systems: for system in scene.stop_systems:
system(world) system(world)
# Récupération de la scène suivante # Récupération de la scène suivante
scene = scenes.get(world.get(CurrentScene, "")) scene = scenes.get(world.get(CurrentScene, ""))
# On arrête la scène globale
for system in global_scene.stop_systems:
system(world)