diff --git a/src/engine.py b/src/engine/__init__.py similarity index 99% rename from src/engine.py rename to src/engine/__init__.py index 8695f56..c7f39dd 100644 --- a/src/engine.py +++ b/src/engine/__init__.py @@ -4,7 +4,7 @@ Permet de lancer un jeu et de gérer la boucle principale de celui-ci. from typing import Callable -from ecs import World +from engine.ecs import World class GlobalScene: diff --git a/src/ecs.py b/src/engine/ecs.py similarity index 100% rename from src/ecs.py rename to src/engine/ecs.py diff --git a/src/maths.py b/src/engine/math.py similarity index 100% rename from src/maths.py rename to src/engine/math.py diff --git a/src/main.py b/src/main.py index f5c57d7..464773a 100644 --- a/src/main.py +++ b/src/main.py @@ -3,11 +3,11 @@ Module d'exemple de l'utilisation du moteur de jeu. """ from engine import Scene, start_game -from plugins import display, inputs, render +from plugins import defaults start_game( - display.PLUGIN + inputs.PLUGIN + render.PLUGIN, + defaults.PLUGIN, { "menu": Scene([], [], []), }, diff --git a/src/plugins/defaults.py b/src/plugins/defaults.py new file mode 100644 index 0000000..e2c086f --- /dev/null +++ b/src/plugins/defaults.py @@ -0,0 +1,8 @@ +""" +Plugin qui rassemple tous les plugins globaux. +""" + +from plugins import display, inputs, render + + +PLUGIN = display.PLUGIN + inputs.PLUGIN + render.PLUGIN diff --git a/src/plugins/display.py b/src/plugins/display.py index e6822bd..3c54842 100644 --- a/src/plugins/display.py +++ b/src/plugins/display.py @@ -4,7 +4,7 @@ Un plugin pour la gestion de la fenetre du jeu. import pygame -from ecs import World +from engine.ecs import World from engine import GlobalScene diff --git a/src/plugins/inputs.py b/src/plugins/inputs.py index 60d627c..cf8f8a5 100644 --- a/src/plugins/inputs.py +++ b/src/plugins/inputs.py @@ -3,9 +3,9 @@ Un plugin permettant de gérer les entrées utilisateur du jeu. """ import pygame -from ecs import World from engine import CurrentScene, GlobalScene, KeepAlive -from maths import Vec2 +from engine.ecs import World +from engine.math import Vec2 from plugins import render diff --git a/src/plugins/render.py b/src/plugins/render.py index 911f05f..6237df2 100644 --- a/src/plugins/render.py +++ b/src/plugins/render.py @@ -3,8 +3,9 @@ Un plugin qui s'occupe de rendre des choses dans la fenetre. """ import pygame - -from engine import GlobalScene +from engine import GlobalScene, KeepAlive +from engine.ecs import World +from engine.math import Vec2 WIDTH = 1440 @@ -27,9 +28,56 @@ def calculate_surface_rect() -> tuple[float, float, float, float]: return offset, 0.0, target_width, float(height) +class Surface(KeepAlive, pygame.Surface): + """ + Ressource qui stocke la surface de rendu du jeu. + """ + + +class Sprite: + """ + Composant donnant la texture d'une entité, sa position et son ordre de rendu. + """ + + def __init__( + self, surface: pygame.Surface, position: Vec2 = Vec2(0), order: float = -1.0 + ): + self.surface = surface + self.position = position + self.order = order + + +def __initialize(world: World): + """ + Prépare le monde pour la gestion du rendu. + """ + world.set(Surface((WIDTH, HEIGHT))) + + +def __render(world: World): + """ + Rend le monde du jeu sur la surface puis l'affiche sur la fenetre. + """ + # On rend le monde sur la surface + surface = world[Surface] + sprites = [entity[Sprite] for entity in world.query(Sprite)] + for sprite in sorted(sprites, key=lambda sprite: sprite.order): + surface.blit(sprite.surface, (sprite.position.x, sprite.position.y)) + + # On affiche la surface sur la fenetre + rect = calculate_surface_rect() + pygame.transform.set_smoothscale_backend("MMX") + pygame.transform.smoothscale( + surface, + (rect[2], rect[3]), + pygame.display.get_surface().subsurface(rect), + ) + pygame.display.flip() + + PLUGIN = GlobalScene( + [__initialize], [], - [], - [], + [__render], [], )