Ajout d'un système d'input et d'un début de système de rendu

This commit is contained in:
Tipragot 2023-10-31 15:12:27 +01:00
parent f97e32308d
commit b8f6c427a4
2 changed files with 121 additions and 0 deletions

86
src/plugins/input.py Normal file
View file

@ -0,0 +1,86 @@
"""
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 plugins import render
class Pressed(KeepAlive, set[str]):
"""
Ressource qui correspond aux touches qui viennent d'être préssées par l'utilisateur.
Pour les boutons de la souris la touche sera nommée `button_x` avec `x` le numéro du bouton.
"""
class Held(KeepAlive, set[str]):
"""
Ressource qui correspond aux touches qui sont actuellement préssées par l'utilisateur.
"""
class Released(KeepAlive, set[str]):
"""
Ressource qui correspond aux touches qui viennent d'être relachées par l'utilisateur.
"""
class MousePosition(KeepAlive, Vec2):
"""
Ressource qui correspond à la position de la souris.
"""
def __initialize(world: World):
"""
Initialise des ressources pour la gestion des entrées utilisateur.
"""
world.set(Pressed(), Held(), Released())
def __update_input(world: World):
"""
Met à jour les ressources qui permettent de savoir quels sont les
entrées utilisateur.
"""
# On récupère les ressources
pressed = world[Pressed]
held = world[Held]
released = world[Released]
# On récupère les évenements de pygame
for event in pygame.event.get():
if event.type == pygame.QUIT:
del world[CurrentScene]
elif event.type == pygame.KEYDOWN:
key_name = pygame.key.name(event.key)
held.add(key_name)
pressed.add(key_name)
elif event.type == pygame.KEYUP:
key_name = pygame.key.name(event.key)
held.remove(key_name)
released.add(key_name)
elif event.type == pygame.MOUSEBUTTONDOWN:
held.add(f"button_{event.button}")
pressed.add(f"button_{event.button}")
elif event.type == pygame.MOUSEBUTTONUP:
held.remove(f"button_{event.button}")
released.add(f"button_{event.button}")
elif event.type == pygame.MOUSEMOTION:
x, y, w, h = render.calculate_surface_rect()
world[MousePosition] = Vec2(
((event.pos[0] - x) / w) * render.WIDTH,
((event.pos[1] - y) / h) * render.HEIGHT,
)
PLUGIN = GlobalScene(
[__initialize],
[__update_input],
[],
[],
)

35
src/plugins/render.py Normal file
View file

@ -0,0 +1,35 @@
"""
Un plugin qui s'occupe de rendre des choses dans la fenetre.
"""
import pygame
from engine import GlobalScene
WIDTH = 1440
HEIGHT = 1080
RATIO = WIDTH / HEIGHT
INVERT_RATIO = HEIGHT / WIDTH
def calculate_surface_rect() -> tuple[float, float, float, float]:
"""
Calcule et renvoie un rectangle qui corresponed a la zone dans laquelle le jeu est rendu.
"""
width, height = pygame.display.get_surface().get_size()
if width / height < RATIO:
target_height = width * INVERT_RATIO
offset = (height - target_height) / 2
return 0.0, offset, float(width), target_height
target_width = height * RATIO
offset = (width - target_width) / 2
return offset, 0.0, target_width, float(height)
PLUGIN = GlobalScene(
[],
[],
[],
[],
)