From 39636498812a72779ea84377cc1d578496eaf11b Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 17:05:50 +0100 Subject: [PATCH] Ajout du rendu des boutons --- src/engine/menu_manager.py | 24 +++++++++++++++++++++++- src/engine/renderer.py | 24 +++++++++++++++++++++++- src/main.py | 6 +++++- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py index f0318d7..27929fa 100644 --- a/src/engine/menu_manager.py +++ b/src/engine/menu_manager.py @@ -1,3 +1,10 @@ +import threading +import tkinter +from types import FunctionType + +import pygame + + class Widget: """Classe parente des widgets de menu.""" def __init__(self, x, y, is_window_relative): @@ -9,7 +16,7 @@ class Widget: class Label(Widget): """Un widget de texte.""" def __init__(self, x: int | float, y: int | float, text: str, size: int | float, color: tuple[int, int, int], - centered: bool = False, is_window_relative: bool = -1): + centered: bool = False, is_window_relative: int = -1): super().__init__(x, y, is_window_relative) self.text = text self.size = size @@ -17,6 +24,21 @@ class Label(Widget): self.color = color +class Button(Widget): + """Un widget de bouton.""" + def __init__(self, x: int | float, y: int | float, text: str, size: int | float, color: tuple[int, int, int], + callback: FunctionType | classmethod | staticmethod, base_image: pygame.Surface, + hover_image: pygame.Surface, centered: bool = False, is_window_relative: int = -1): + super().__init__(x, y, is_window_relative) + self.text = text + self.size = size + self.color = color + self.callback = callback + self.base_image = base_image + self.hover_image = hover_image + self.centered = centered + + class Menu: """Un menu contenant des widgets.""" def __init__(self): diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 8f93755..7d13849 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -7,7 +7,7 @@ from pygame.locals import RESIZABLE, SRCALPHA, FULLSCREEN import src.engine.engine as engine from src.engine.animation import Anim from src.engine.enums import GameState -from src.engine.menu_manager import Label +from src.engine.menu_manager import Label, Button class Renderer: @@ -190,6 +190,28 @@ class Renderer: y-rendered_text.get_height()//2)) else: self.window.blit(rendered_text, (x, y)) + elif isinstance(widget, Button): + print("a") + # On multiplie la taille du texte si besoin + if widget.is_window_relative == 0: + size = widget.size*window_size[0] + elif widget.is_window_relative == 1: + size = widget.size*window_size[1] + elif widget.is_window_relative == 2: + size = widget.size*min(window_size[0], window_size[1]) + else: + size = widget.size + + text_font = font.SysFont("Arial", round(size)) + + # On affiche l'image du boutton + self.window.blit(widget.base_image, (x-widget.base_image.get_width()//2, + y-widget.base_image.get_height()//2)) + + rendered_text = text_font.render(widget.text, True, widget.color) + self.window.blit(rendered_text, (x-rendered_text.get_width()//2, + y-rendered_text.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 ad30c2c..ec16d23 100644 --- a/src/main.py +++ b/src/main.py @@ -4,7 +4,7 @@ from src.custom_AI import WolfAI from src.engine.animation import Anim from src.engine.engine import Engine from src.engine.enums import GameState -from src.engine.menu_manager import Menu, Label +from src.engine.menu_manager import Menu, Label, Button class Game(Engine): @@ -35,6 +35,10 @@ class Game(Engine): """Crée les éléments du menu principal.""" menu = Menu() menu.add_widget(Label(0.5, 0.1, "The Forest's Secret", 0.1, (0, 255, 0), True, 2)) + + base_image = pygame.image.load("assets/textures/GUI/button_1.png").convert_alpha() + + menu.add_widget(Button(0.5, 0.3, "boutton", 0.1, (0, 255, 0), lambda : print("play"), base_image, base_image, True, 2)) self.menu_manager.register_menu(menu, "main") self.menu_manager.show("main")