diff --git a/src/plugins/input.py b/src/plugins/input.py new file mode 100644 index 0000000..60d627c --- /dev/null +++ b/src/plugins/input.py @@ -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], + [], + [], +) diff --git a/src/plugins/render.py b/src/plugins/render.py new file mode 100644 index 0000000..911f05f --- /dev/null +++ b/src/plugins/render.py @@ -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( + [], + [], + [], + [], +)