diff --git a/assets/textures/GUI/slider_cursor_1.png b/assets/textures/GUI/slider_cursor_1.png new file mode 100644 index 0000000..bd5477f Binary files /dev/null and b/assets/textures/GUI/slider_cursor_1.png differ diff --git a/assets/textures/GUI/slider_cursor_2.png b/assets/textures/GUI/slider_cursor_2.png new file mode 100644 index 0000000..1cb7999 Binary files /dev/null and b/assets/textures/GUI/slider_cursor_2.png differ diff --git a/assets/textures/GUI/slider_rail_1.png b/assets/textures/GUI/slider_rail_1.png new file mode 100644 index 0000000..26bf1e1 Binary files /dev/null and b/assets/textures/GUI/slider_rail_1.png differ diff --git a/src/engine/event_handler.py b/src/engine/event_handler.py index 4f4068a..df4b2ac 100644 --- a/src/engine/event_handler.py +++ b/src/engine/event_handler.py @@ -63,6 +63,7 @@ class EventHandler: def register_slider_area(self, size: tuple[float | int, float | int], motion_rect: tuple[float | int, float | int, float | int, float | int], motion_axes: tuple[bool, bool], + name: str, is_window_relative: int = -1, clicked_callback: FunctionType | classmethod | staticmethod = None, released_callback: FunctionType | classmethod | staticmethod = None, @@ -71,9 +72,20 @@ class EventHandler: """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_callback]) + clicked_callback, released_callback, hover_callback, motion_callback, name]) # Le premier booléen correspond à l'état de suivi de la souris + def remove_slider_area(self, name: str): + """Supprime les sliders aux noms donnés.""" + + # On itère dans toute la liste et on ne garde que les éléments ne portant pas le nom cherché + cleared_list = [] + for area in self.sliders_area: + if area[10] != name: + cleared_list.append(area) + + self.sliders_area = cleared_list + @staticmethod def get_slider_area_values(slider: list): """Donne la valeur de la zone de slider donnée.""" diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py index 885cfaf..7006d9d 100644 --- a/src/engine/menu_manager.py +++ b/src/engine/menu_manager.py @@ -32,11 +32,13 @@ class Slider(Widget): width: int | float, base_image: pygame.Surface, hover_image: pygame.Surface, + rail_image: pygame.Surface, is_window_relative: int = -1, area_name: str = "menu_slider"): super().__init__(area_rect[0], area_rect[1], is_window_relative) self.base_image = base_image self.hover_image = hover_image + self.rail_image = rail_image self.area_name = area_name self.hovered = False self.follow_mouse = False @@ -117,6 +119,7 @@ class MenuManager: elif isinstance(widget, Slider): self.engine.event_handler.register_slider_area(widget.cursor_size, (widget.x, widget.y, widget.width, 1), (True, False), + widget.area_name, widget.is_window_relative, hover_callback=widget.set_hover_state, motion_callback=widget.set_value) diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 3703eb1..c1cadf8 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -308,10 +308,11 @@ class Renderer: (slider_image.get_width()*window_size[0]/self.window_size[0], slider_image.get_height()*window_size[1]/self.window_size[1])) + self.window.blit(widget.rail_image, (x+(widget.width-widget.rail_image.get_width()) // 2, + y - widget.rail_image.get_height() // 2)) 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): """Rend la boite de dialogue lorsqu'un dialogue est lancé.""" diff --git a/src/main.py b/src/main.py index 372ec48..c7b89b9 100644 --- a/src/main.py +++ b/src/main.py @@ -40,11 +40,15 @@ class Game(Engine): menu = Menu() menu.add_widget(Label(0.5, 0.1, "The Forest's Secret", 0.1, (0, 0, 0), True, 0)) - base_image = pygame.image.load("assets/textures/GUI/button_1.png").convert_alpha() - hover_image = pygame.image.load("assets/textures/GUI/button_2.png").convert_alpha() + btn_base_image = pygame.image.load("assets/textures/GUI/button_1.png").convert_alpha() + btn_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((50, 50), (100, 300), 100, base_image, hover_image)) + slider_base_image = pygame.image.load("assets/textures/GUI/slider_cursor_1.png").convert_alpha() + slider_hover_image = pygame.image.load("assets/textures/GUI/slider_cursor_2.png").convert_alpha() + slider_rail_image = pygame.image.load("assets/textures/GUI/slider_rail_1.png").convert_alpha() + + menu.add_widget(Button(0.5, 0.3, "play", 0.08, (0, 0, 0), self.start_game, btn_base_image, btn_hover_image, True, 0)) + menu.add_widget(Slider((50, 50), (100, 300), 136, slider_base_image, slider_hover_image, slider_rail_image)) self.menu_manager.register_menu(menu, "main") self.menu_manager.show("main")