Support de la redimension automatique des boutons

This commit is contained in:
Yannis 2024-01-06 19:27:31 +01:00
parent f2fa0dd81f
commit 48611ef4e9

View file

@ -1,7 +1,7 @@
import math import math
from types import FunctionType from types import FunctionType
from pygame import event from pygame import event, display
from pygame.locals import * from pygame.locals import *
import src.engine.engine as engine import src.engine.engine as engine
@ -16,14 +16,30 @@ class EventHandler:
self.buttons_area = [] self.buttons_area = []
@staticmethod @staticmethod
def get_click_collision(rect: tuple[int, int, int, int], point: tuple[int, int]): def get_click_collision(rect: tuple[float | int, float | int, float | int, float | int], point: tuple[int, int],
is_window_relative: int):
"""Vérifie si le point et le rectangle donné sont en collision.""" """Vérifie si le point et le rectangle donné sont en collision."""
window_size = display.get_window_size()
if is_window_relative == 0:
return (rect[0]*window_size[0] < point[0]*window_size[0] < rect[0]*window_size[0] + rect[2]*window_size[0]
and rect[1]*window_size[0] < point[1]*window_size[0] < rect[1]*window_size[0] + rect[3]*window_size[0])
elif is_window_relative == 1:
return (rect[0] * window_size[1] < point[0] * window_size[1] < rect[0] * window_size[1] + rect[2] *
window_size[1]
and rect[1] * window_size[1] < point[1] * window_size[1] < rect[1] * window_size[1] + rect[3] *
window_size[1])
return rect[0] < point[0] < rect[0] + rect[2] and rect[1] < point[1] < rect[1] + rect[3] return rect[0] < point[0] < rect[0] + rect[2] and rect[1] < point[1] < rect[1] + rect[3]
def register_button_area(self, rect: tuple[int, int, int, int], callback: FunctionType | classmethod | staticmethod): def register_button_area(self, rect: tuple[float | int, float | int, float | int, float | int],
callback: FunctionType | classmethod | staticmethod,
is_window_relative: int = -1):
"""Enregistre une zone comme bouton. La fonction donnée sera donc executé lorsque la zone sur la fenêtre """Enregistre une zone comme bouton. La fonction donnée sera donc executé lorsque la zone sur la fenêtre
sera cliqué.""" sera cliqué. is_window_relative doit être 0 pour que le rect soit multipliée par la largeur de la fenêtre et 1
self.buttons_area.append((rect, callback)) pour qu'elle soit multipliée par la hauteur"""
self.buttons_area.append((rect, callback, is_window_relative))
def update(self): def update(self):
"""Vérifie s'il y a de nouvelles interactions et les traites.""" """Vérifie s'il y a de nouvelles interactions et les traites."""
@ -41,7 +57,7 @@ class EventHandler:
# Vérifie si une des zones enregistrées comme bouton n'a pas été cliqué # Vérifie si une des zones enregistrées comme bouton n'a pas été cliqué
if e.button == 1: if e.button == 1:
for area in self.buttons_area: for area in self.buttons_area:
if self.get_click_collision(area[0], e.pos): if self.get_click_collision(area[0], e.pos, area[2]):
area[1]() area[1]()
if self.engine.entity_manager.player_entity_name: if self.engine.entity_manager.player_entity_name: