sliders #32
|
@ -66,10 +66,12 @@ class EventHandler:
|
||||||
is_window_relative: int = -1,
|
is_window_relative: int = -1,
|
||||||
clicked_callback: FunctionType | classmethod | staticmethod = None,
|
clicked_callback: FunctionType | classmethod | staticmethod = None,
|
||||||
released_callback: FunctionType | classmethod | staticmethod = None,
|
released_callback: FunctionType | classmethod | staticmethod = None,
|
||||||
|
motion_callback: FunctionType | classmethod | staticmethod = None,
|
||||||
hover_callback: FunctionType | classmethod | staticmethod = None):
|
hover_callback: FunctionType | classmethod | staticmethod = None):
|
||||||
"""Enregistre une zone comme une zone déplaçable à l'écran."""
|
"""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),
|
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
|
# Le premier booléen correspond à l'état de suivi de la souris
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -165,6 +167,9 @@ class EventHandler:
|
||||||
area[0][1] = area[5][1]
|
area[0][1] = area[5][1]
|
||||||
if area[0][1] > area[5][1]+area[5][3]:
|
if area[0][1] > area[5][1]+area[5][3]:
|
||||||
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 area[8] is not None:
|
||||||
if self.get_click_collision(
|
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]),
|
(area[0][0] - area[0][2] / 2, area[0][1] - area[0][3] / 2, area[0][2], area[0][3]),
|
||||||
|
|
|
@ -27,26 +27,30 @@ class Label(Widget):
|
||||||
class Slider(Widget):
|
class Slider(Widget):
|
||||||
"""Un widget pouvant être glissé pour récupérer une valeur."""
|
"""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,
|
base_image: pygame.Surface,
|
||||||
hover_image: pygame.Surface,
|
hover_image: pygame.Surface,
|
||||||
is_window_relative: int = -1,
|
is_window_relative: int = -1,
|
||||||
area_name: str = "menu_slider"):
|
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.base_image = base_image
|
||||||
self.hover_image = hover_image
|
self.hover_image = hover_image
|
||||||
self.area_name = area_name
|
self.area_name = area_name
|
||||||
self.hovered = False
|
self.hovered = False
|
||||||
self.follow_mouse = False
|
self.follow_mouse = False
|
||||||
|
self.cursor_size = cursor_size
|
||||||
self.value = 0.
|
self.value = 0.
|
||||||
self.width = 100
|
self.width = width
|
||||||
|
|
||||||
def set_hover_state(self, state: bool):
|
def set_hover_state(self, state: bool):
|
||||||
"""Modifie la valeur du hover."""
|
"""Modifie la valeur du hover."""
|
||||||
self.hovered = state
|
self.hovered = state
|
||||||
|
|
||||||
def set_mouse_pos(self, x: int):
|
def set_value(self, values: tuple[float, float]):
|
||||||
self.value = (x-self.x)/self.width
|
"""Appelée lorsque la valeur du slider est modifiée."""
|
||||||
|
self.value = values[0]
|
||||||
|
|
||||||
|
|
||||||
class Button(Widget):
|
class Button(Widget):
|
||||||
|
@ -98,18 +102,24 @@ class MenuManager:
|
||||||
self.active_menu = self.menus[name]
|
self.active_menu = self.menus[name]
|
||||||
|
|
||||||
# On itère dans tous les bouttons pour leur ajouter une interaction
|
# On itère dans tous les bouttons pour leur ajouter une interaction
|
||||||
for btn in self.active_menu.widgets:
|
for widget in self.active_menu.widgets:
|
||||||
if isinstance(btn, Button):
|
if isinstance(widget, Button):
|
||||||
width = btn.base_image.get_width() / self.engine.renderer.window_size[0]
|
width = widget.base_image.get_width() / self.engine.renderer.window_size[0]
|
||||||
height = btn.base_image.get_height() / self.engine.renderer.window_size[1]
|
height = widget.base_image.get_height() / self.engine.renderer.window_size[1]
|
||||||
area_x = btn.x
|
area_x = widget.x
|
||||||
area_y = btn.y
|
area_y = widget.y
|
||||||
if btn.centered:
|
if widget.centered:
|
||||||
area_x -= width / 2
|
area_x -= width / 2
|
||||||
area_y -= height / 2
|
area_y -= height / 2
|
||||||
self.engine.event_handler.register_button_area((area_x, area_y, width, height), btn.callback,
|
self.engine.event_handler.register_button_area((area_x, area_y, width, height), widget.callback,
|
||||||
btn.area_name,
|
widget.area_name,
|
||||||
btn.is_window_relative, btn.set_hover_state)
|
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):
|
def hide(self):
|
||||||
"""Affiche le menu actuelement à l'écran."""
|
"""Affiche le menu actuelement à l'écran."""
|
||||||
|
|
|
@ -291,23 +291,25 @@ class Renderer:
|
||||||
self.window.blit(rendered_text, (x, y))
|
self.window.blit(rendered_text, (x, y))
|
||||||
elif isinstance(widget, Slider):
|
elif isinstance(widget, Slider):
|
||||||
if widget.hovered:
|
if widget.hovered:
|
||||||
btn_image = widget.hover_image
|
slider_image = widget.hover_image
|
||||||
else:
|
else:
|
||||||
btn_image = widget.base_image
|
slider_image = widget.base_image
|
||||||
|
|
||||||
if widget.is_window_relative == 0:
|
if widget.is_window_relative == 0:
|
||||||
btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0],
|
slider_image = transform.scale(slider_image,
|
||||||
btn_image.get_height()*window_size[0]/self.window_size[0]))
|
(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:
|
elif widget.is_window_relative == 1:
|
||||||
btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[1]/self.window_size[1],
|
slider_image = transform.scale(slider_image,
|
||||||
btn_image.get_height()*window_size[1]/self.window_size[1]))
|
(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:
|
elif widget.is_window_relative == 2:
|
||||||
btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0],
|
slider_image = transform.scale(slider_image,
|
||||||
btn_image.get_height()*window_size[1]/self.window_size[1]))
|
(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(slider_image, (x+widget.value*widget.width-slider_image.get_width()//2,
|
||||||
|
y-slider_image.get_height()//2))
|
||||||
self.window.blit(btn_image, (x+widget.value*widget.width, y))
|
|
||||||
|
|
||||||
|
|
||||||
def render_dialogs_box(self):
|
def render_dialogs_box(self):
|
||||||
|
|
|
@ -44,11 +44,9 @@ class Game(Engine):
|
||||||
hover_image = pygame.image.load("assets/textures/GUI/button_2.png").convert_alpha()
|
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(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.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")
|
self.menu_manager.show("main")
|
||||||
|
|
||||||
def create_player_entity(self):
|
def create_player_entity(self):
|
||||||
|
|
Loading…
Reference in a new issue