ecs #58
86
src/plugins/input.py
Normal file
86
src/plugins/input.py
Normal 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
35
src/plugins/render.py
Normal 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(
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
)
|
Loading…
Reference in a new issue