Ajout du plugin de rendu et piti fix

This commit is contained in:
Tipragot 2023-10-31 17:07:41 +01:00
parent 6cf88cb261
commit 894e150484
8 changed files with 66 additions and 10 deletions

View file

@ -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:

View file

@ -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([], [], []),
},

8
src/plugins/defaults.py Normal file
View file

@ -0,0 +1,8 @@
"""
Plugin qui rassemple tous les plugins globaux.
"""
from plugins import display, inputs, render
PLUGIN = display.PLUGIN + inputs.PLUGIN + render.PLUGIN

View file

@ -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

View file

@ -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

View file

@ -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],
[],
)