ecs #58
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue