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