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