""" Définit un plugin qui gère les évenements pygame. """ from engine import * from engine.math import Vec2 import pygame class PygamePlugin(Plugin): """ Plugin qui gère les évenements pygame. """ @staticmethod def _initialize(world: World) -> None: pygame.init() # Initialisation des ressources world.set( Display(pygame.display.set_mode((800, 600), pygame.RESIZABLE)), Keyboard(), Mouse(), ) @staticmethod def _check_events(world: World) -> None: world[Display].size = Vec2(*pygame.display.get_surface().get_size()) keyboard = world[Keyboard] keyboard.pressed.clear() keyboard.released.clear() mouse = world[Mouse] mouse.pressed.clear() mouse.released.clear() for event in pygame.event.get(): if event.type == pygame.QUIT: world[Game].stop() elif event.type == pygame.KEYDOWN: key_name = pygame.key.name(event.key) keyboard.keys.add(key_name) keyboard.pressed.add(key_name) elif event.type == pygame.KEYUP: key_name = pygame.key.name(event.key) keyboard.keys.remove(key_name) keyboard.released.add(key_name) elif event.type == pygame.MOUSEBUTTONDOWN: mouse.buttons.add(event.button) mouse.pressed.add(event.button) elif event.type == pygame.MOUSEBUTTONUP: mouse.buttons.remove(event.button) mouse.released.add(event.button) elif event.type == pygame.MOUSEMOTION: mouse.position = Vec2(float(event.pos[0]), float(event.pos[1])) @staticmethod def _flip_display(world: World) -> None: """ Met a jour le rendu de l'écran. """ display = world[Display] pygame.display.flip() pygame.display.get_surface().fill((0, 0, 0)) @staticmethod def _terminate(world: World) -> None: pygame.quit() def apply(self, game: Game) -> None: """ Applique le plugin a un jeu. Paramètres: game: Le jeu auquel appliquer le plugin. """ game.add_pre_startup_tasks(self._initialize) game.add_pre_update_tasks(self._check_events) game.add_post_render_tasks(self._flip_display) game.add_post_shutdown_tasks(self._terminate) class Display: """ Ressource qui represente la fenetre du jeu. """ def __init__(self, display: pygame.Surface) -> None: self.size: Vec2 = Vec2(*display.get_size()) @property def width(self) -> float: """ Retourne la largeur de la fenetre. """ return self.size.x @property def height(self) -> float: """ Retourne la hauteur de la fenetre. """ return self.size.y class Keyboard: """ Ressource qui représente les entrées utilisateurs sur le clavier à la frame actuelle. """ def __init__(self) -> None: self.keys: set[str] = set() self.pressed: set[str] = set() self.released: set[str] = set() def is_key_pressed(self, key_name: str) -> bool: """ Renvoie True si la touche *key_name* a commencé a être appuyée pendant la frame actuelle. Paramètres: key_name: Le nom de la touche à tester. Retourne: True si la touche *key_name* a commencé a être appuyée pendant la frame actuelle. """ return key_name in self.pressed def is_key(self, key_name: str) -> bool: """ Renvoie True si la touche *key_name* est actuellement appuyée. Paramètres: key_name: Le nom de la touche à tester. Retourne: True si la touche *key_name* est actuellement appuyée. """ return key_name in self.keys def is_key_released(self, key_name: str) -> bool: """ Renvoie True si la touche *key_name* a été relachée pendant la frame actuelle. Paramètres: key_name: Le nom de la touche à tester. Retourne: True si la touche *key_name* a été relachée pendant la frame actuelle. """ return key_name in self.released class Mouse: """ Ressource qui représente l'état de la souris à la frame actuelle. """ def __init__(self) -> None: self.buttons: set[int] = set() self.pressed: set[int] = set() self.released: set[int] = set() self.position: Vec2 = Vec2(0.0, 0.0) def is_button_pressed(self, button: int) -> bool: """ Renvoie True si le bouton *button* a commencé a être appuyée pendant la frame actuelle. Paramètres: button: Le numéro du bouton à tester. Retourne: True si le bouton *button* a commencé a être appuyée pendant la frame actuelle. """ return button in self.pressed def is_button(self, button: int) -> bool: """ Renvoie True si le bouton *button* est actuellement appuyé. Paramètres: button: Le numéro du bouton à tester. Retourne: True si le bouton *button* est actuellement appuyé. """ return button in self.buttons def is_button_released(self, button: int) -> bool: """ Renvoie True si le bouton *button* a été relaché pendant la frame actuelle. Paramètres: button: Le numéro du bouton à tester. Retourne: True si le bouton *button* aLongrightarrow relaché pendant la frame actuelle. """ return button in self.released