Ajout du rendu et début d'implementation des sliders

This commit is contained in:
Yannis 2024-01-12 18:16:47 +01:00
parent 37cdffc8e3
commit 4128f32d26
4 changed files with 45 additions and 30 deletions

View file

@ -66,10 +66,12 @@ class EventHandler:
is_window_relative: int = -1,
clicked_callback: FunctionType | classmethod | staticmethod = None,
released_callback: FunctionType | classmethod | staticmethod = None,
motion_callback: FunctionType | classmethod | staticmethod = None,
hover_callback: FunctionType | classmethod | staticmethod = None):
"""Enregistre une zone comme une zone déplaçable à l'écran."""
self.sliders_area.append([[motion_rect[0], motion_rect[1], *size], is_window_relative, False, (0, 0),
motion_axes, motion_rect, clicked_callback, released_callback, hover_callback])
motion_axes, motion_rect,
clicked_callback, released_callback, hover_callback, motion_callback])
# Le premier booléen correspond à l'état de suivi de la souris
@staticmethod
@ -165,6 +167,9 @@ class EventHandler:
area[0][1] = area[5][1]
if area[0][1] > area[5][1]+area[5][3]:
area[0][1] = area[5][1]+area[5][3]
if area[9] is not None:
area[9](self.get_slider_area_values(area))
if area[8] is not None:
if self.get_click_collision(
(area[0][0] - area[0][2] / 2, area[0][1] - area[0][3] / 2, area[0][2], area[0][3]),

View file

@ -27,26 +27,30 @@ class Label(Widget):
class Slider(Widget):
"""Un widget pouvant être glissé pour récupérer une valeur."""
def __init__(self, x: int | float, y: int | float,
def __init__(self, cursor_size: tuple[int | float, int | float],
area_rect: tuple[int | float, int | float],
width: int | float,
base_image: pygame.Surface,
hover_image: pygame.Surface,
is_window_relative: int = -1,
area_name: str = "menu_slider"):
super().__init__(x, y, is_window_relative)
super().__init__(area_rect[0], area_rect[1], is_window_relative)
self.base_image = base_image
self.hover_image = hover_image
self.area_name = area_name
self.hovered = False
self.follow_mouse = False
self.cursor_size = cursor_size
self.value = 0.
self.width = 100
self.width = width
def set_hover_state(self, state: bool):
"""Modifie la valeur du hover."""
self.hovered = state
def set_mouse_pos(self, x: int):
self.value = (x-self.x)/self.width
def set_value(self, values: tuple[float, float]):
"""Appelée lorsque la valeur du slider est modifiée."""
self.value = values[0]
class Button(Widget):
@ -98,18 +102,24 @@ class MenuManager:
self.active_menu = self.menus[name]
# On itère dans tous les bouttons pour leur ajouter une interaction
for btn in self.active_menu.widgets:
if isinstance(btn, Button):
width = btn.base_image.get_width() / self.engine.renderer.window_size[0]
height = btn.base_image.get_height() / self.engine.renderer.window_size[1]
area_x = btn.x
area_y = btn.y
if btn.centered:
for widget in self.active_menu.widgets:
if isinstance(widget, Button):
width = widget.base_image.get_width() / self.engine.renderer.window_size[0]
height = widget.base_image.get_height() / self.engine.renderer.window_size[1]
area_x = widget.x
area_y = widget.y
if widget.centered:
area_x -= width / 2
area_y -= height / 2
self.engine.event_handler.register_button_area((area_x, area_y, width, height), btn.callback,
btn.area_name,
btn.is_window_relative, btn.set_hover_state)
self.engine.event_handler.register_button_area((area_x, area_y, width, height), widget.callback,
widget.area_name,
widget.is_window_relative, widget.set_hover_state)
elif isinstance(widget, Slider):
self.engine.event_handler.register_slider_area(widget.cursor_size,
(widget.x, widget.y, widget.width, 1), (True, False),
widget.is_window_relative,
hover_callback=widget.set_hover_state,
motion_callback=widget.set_value)
def hide(self):
"""Affiche le menu actuelement à l'écran."""

View file

@ -291,23 +291,25 @@ class Renderer:
self.window.blit(rendered_text, (x, y))
elif isinstance(widget, Slider):
if widget.hovered:
btn_image = widget.hover_image
slider_image = widget.hover_image
else:
btn_image = widget.base_image
slider_image = widget.base_image
if widget.is_window_relative == 0:
btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0],
btn_image.get_height()*window_size[0]/self.window_size[0]))
slider_image = transform.scale(slider_image,
(slider_image.get_width()*window_size[0]/self.window_size[0],
slider_image.get_height()*window_size[0]/self.window_size[0]))
elif widget.is_window_relative == 1:
btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[1]/self.window_size[1],
btn_image.get_height()*window_size[1]/self.window_size[1]))
slider_image = transform.scale(slider_image,
(slider_image.get_width()*window_size[1]/self.window_size[1],
slider_image.get_height()*window_size[1]/self.window_size[1]))
elif widget.is_window_relative == 2:
btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0],
btn_image.get_height()*window_size[1]/self.window_size[1]))
slider_image = transform.scale(slider_image,
(slider_image.get_width()*window_size[0]/self.window_size[0],
slider_image.get_height()*window_size[1]/self.window_size[1]))
# On affiche l'image du boutton
self.window.blit(btn_image, (x+widget.value*widget.width, y))
self.window.blit(slider_image, (x+widget.value*widget.width-slider_image.get_width()//2,
y-slider_image.get_height()//2))
def render_dialogs_box(self):

View file

@ -44,11 +44,9 @@ class Game(Engine):
hover_image = pygame.image.load("assets/textures/GUI/button_2.png").convert_alpha()
menu.add_widget(Button(0.5, 0.3, "play", 0.08, (0, 0, 0), self.start_game, base_image, hover_image, True, 0))
menu.add_widget(Slider(40, 200, base_image, hover_image))
menu.add_widget(Slider((50, 50), (100, 300), 100, base_image, hover_image))
self.menu_manager.register_menu(menu, "main")
self.event_handler.register_slider_area((0.1, 0.1), (0.2, 0.4, 0.3, 0.3), (True, True), 1, clicked_callback=print, released_callback=print, hover_callback=print)
self.menu_manager.show("main")
def create_player_entity(self):