2023-10-24 15:02:10 +00:00
|
|
|
"""
|
|
|
|
Définit un plugin qui gère les évenements pygame.
|
|
|
|
"""
|
|
|
|
|
|
|
|
from engine import *
|
|
|
|
from engine.math import Vec2
|
2023-10-25 13:36:29 +00:00
|
|
|
import pygame
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
class PygamePlugin(Plugin):
|
|
|
|
"""
|
|
|
|
Plugin qui gère les évenements pygame.
|
|
|
|
"""
|
|
|
|
|
|
|
|
@staticmethod
|
2023-10-25 13:36:29 +00:00
|
|
|
def _initialize(world: World) -> None:
|
2023-10-24 15:02:10 +00:00
|
|
|
pygame.init()
|
|
|
|
|
|
|
|
# Initialisation des ressources
|
2023-10-25 13:36:29 +00:00
|
|
|
world.set(
|
|
|
|
Display(pygame.display.set_mode((800, 600), pygame.RESIZABLE)),
|
|
|
|
Keyboard(),
|
|
|
|
Mouse(),
|
|
|
|
)
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _check_events(world: World) -> None:
|
2023-10-25 13:36:29 +00:00
|
|
|
world[Display].size = Vec2(*pygame.display.get_surface().get_size())
|
|
|
|
|
2023-10-24 15:08:39 +00:00
|
|
|
keyboard = world[Keyboard]
|
2023-10-24 15:10:25 +00:00
|
|
|
keyboard.pressed.clear()
|
|
|
|
keyboard.released.clear()
|
2023-10-24 15:02:10 +00:00
|
|
|
|
2023-10-24 15:08:39 +00:00
|
|
|
mouse = world[Mouse]
|
2023-10-24 15:10:25 +00:00
|
|
|
mouse.pressed.clear()
|
|
|
|
mouse.released.clear()
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
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)
|
2023-10-24 15:10:25 +00:00
|
|
|
keyboard.keys.add(key_name)
|
|
|
|
keyboard.pressed.add(key_name)
|
2023-10-24 15:02:10 +00:00
|
|
|
elif event.type == pygame.KEYUP:
|
|
|
|
key_name = pygame.key.name(event.key)
|
2023-10-24 15:10:25 +00:00
|
|
|
keyboard.keys.remove(key_name)
|
|
|
|
keyboard.released.add(key_name)
|
2023-10-24 15:02:10 +00:00
|
|
|
elif event.type == pygame.MOUSEBUTTONDOWN:
|
2023-10-24 15:10:25 +00:00
|
|
|
mouse.buttons.add(event.button)
|
|
|
|
mouse.pressed.add(event.button)
|
2023-10-24 15:02:10 +00:00
|
|
|
elif event.type == pygame.MOUSEBUTTONUP:
|
2023-10-24 15:10:25 +00:00
|
|
|
mouse.buttons.remove(event.button)
|
|
|
|
mouse.released.add(event.button)
|
2023-10-24 15:02:10 +00:00
|
|
|
elif event.type == pygame.MOUSEMOTION:
|
2023-10-24 15:10:25 +00:00
|
|
|
mouse.position = Vec2(float(event.pos[0]), float(event.pos[1]))
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
@staticmethod
|
2023-10-25 13:36:29 +00:00
|
|
|
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:
|
2023-10-24 15:02:10 +00:00
|
|
|
pygame.quit()
|
|
|
|
|
|
|
|
def apply(self, game: Game) -> None:
|
|
|
|
"""
|
|
|
|
Applique le plugin a un jeu.
|
|
|
|
|
|
|
|
Paramètres:
|
|
|
|
game: Le jeu auquel appliquer le plugin.
|
|
|
|
"""
|
2023-10-25 13:36:29 +00:00
|
|
|
game.add_pre_startup_tasks(self._initialize)
|
2023-10-24 15:02:10 +00:00
|
|
|
game.add_pre_update_tasks(self._check_events)
|
2023-10-25 13:36:29 +00:00
|
|
|
game.add_post_render_tasks(self._flip_display)
|
|
|
|
game.add_post_shutdown_tasks(self._terminate)
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Display:
|
|
|
|
"""
|
|
|
|
Ressource qui represente la fenetre du jeu.
|
|
|
|
"""
|
|
|
|
|
2023-10-25 13:36:29 +00:00
|
|
|
def __init__(self, display: pygame.Surface) -> None:
|
|
|
|
self.size: Vec2 = Vec2(*display.get_size())
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
@property
|
2023-10-25 13:36:29 +00:00
|
|
|
def width(self) -> float:
|
2023-10-24 15:02:10 +00:00
|
|
|
"""
|
2023-10-25 13:36:29 +00:00
|
|
|
Retourne la largeur de la fenetre.
|
2023-10-24 15:02:10 +00:00
|
|
|
"""
|
2023-10-25 13:36:29 +00:00
|
|
|
return self.size.x
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
@property
|
2023-10-25 13:36:29 +00:00
|
|
|
def height(self) -> float:
|
2023-10-24 15:02:10 +00:00
|
|
|
"""
|
2023-10-25 13:36:29 +00:00
|
|
|
Retourne la hauteur de la fenetre.
|
2023-10-24 15:02:10 +00:00
|
|
|
"""
|
2023-10-25 13:36:29 +00:00
|
|
|
return self.size.y
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Keyboard:
|
|
|
|
"""
|
|
|
|
Ressource qui représente les entrées utilisateurs sur le clavier à la frame actuelle.
|
|
|
|
"""
|
|
|
|
|
2023-10-24 15:08:39 +00:00
|
|
|
def __init__(self) -> None:
|
2023-10-24 15:10:25 +00:00
|
|
|
self.keys: set[str] = set()
|
|
|
|
self.pressed: set[str] = set()
|
|
|
|
self.released: set[str] = set()
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
"""
|
2023-10-24 15:10:25 +00:00
|
|
|
return key_name in self.pressed
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
"""
|
2023-10-24 15:10:25 +00:00
|
|
|
return key_name in self.keys
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
"""
|
2023-10-24 15:10:25 +00:00
|
|
|
return key_name in self.released
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Mouse:
|
|
|
|
"""
|
|
|
|
Ressource qui représente l'état de la souris à la frame actuelle.
|
|
|
|
"""
|
|
|
|
|
2023-10-24 15:08:39 +00:00
|
|
|
def __init__(self) -> None:
|
2023-10-24 15:10:25 +00:00
|
|
|
self.buttons: set[int] = set()
|
|
|
|
self.pressed: set[int] = set()
|
|
|
|
self.released: set[int] = set()
|
|
|
|
self.position: Vec2 = Vec2(0.0, 0.0)
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
"""
|
2023-10-24 15:10:25 +00:00
|
|
|
return button in self.pressed
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
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é.
|
|
|
|
"""
|
2023-10-24 15:10:25 +00:00
|
|
|
return button in self.buttons
|
2023-10-24 15:02:10 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
"""
|
2023-10-24 15:10:25 +00:00
|
|
|
return button in self.released
|