diff --git a/src/engine/engine.py b/src/engine/engine.py index 0d67740..ce18718 100644 --- a/src/engine/engine.py +++ b/src/engine/engine.py @@ -5,6 +5,7 @@ from src.engine.entity_manager import EntityManager from src.engine.event_handler import EventHandler from src.engine.event_sheduler import EventSheduler from src.engine.map_manager import MapManager +from src.engine.menu_manager import MenuManager from src.engine.renderer import Renderer from src.engine.enums import GameState import pygame @@ -35,6 +36,7 @@ class Engine: self.boss_fight_manager = BossFightManager(self) self.event_sheduler = EventSheduler(self) self.dialogs_manager = DialogsManager(self.event_handler) + self.menu_manager = MenuManager() def loop(self): """Fonction à lancer au début du programme et qui va lancer les updates dans une boucle. diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py index fabd488..f0318d7 100644 --- a/src/engine/menu_manager.py +++ b/src/engine/menu_manager.py @@ -8,12 +8,13 @@ class Widget: class Label(Widget): """Un widget de texte.""" - def __init__(self, x: int | float, y: int | float, text: str, size: int | float, centered: bool = False, - is_window_relative: bool = -1): + 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): super().__init__(x, y, is_window_relative) self.text = text self.size = size self.centered = centered + self.color = color class Menu: @@ -31,7 +32,16 @@ class MenuManager: def __init__(self): self.menus = {} + self.active_menu: Menu | None = None def register_menu(self, menu: Menu, name: str): """Ajoute le menu donné au manager de menu avec le nom donné.""" self.menus[name] = menu + + def show(self, name: str): + """Affiche le menu au nom donné.""" + self.active_menu = self.menus[name] + + def hide(self): + """Affiche le menu actuelement à l'écran.""" + self.active_menu = None diff --git a/src/engine/renderer.py b/src/engine/renderer.py index fe898fc..8f93755 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -7,6 +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 class Renderer: @@ -111,6 +112,9 @@ class Renderer: self.render_boss_fight_scene(delta) self.render_boss_fight_gui() + # Rend les menus + self.render_menus() + # Conteur de FPS en mode DEBUG if self.engine.DEBUG_MODE: self.window.blit(font.SysFont("Arial", 20).render(f"FPS: {self.engine.clock.get_fps()}", True, (255, 0, 0)), @@ -146,6 +150,47 @@ class Renderer: # Apres avoir tout rendu, on met à jour l'écran display.update() + def render_menus(self): + """Rend le menu enregistré comme visible.""" + window_size = display.get_window_size() + + # Si un menu est affiché, on itère dans tous ses widgets + if self.engine.menu_manager.active_menu is not None: + for widget in self.engine.menu_manager.active_menu.widgets: + # On multiplie les coordonnées par la taille de la fenetre si besoin + if widget.is_window_relative == 0: + x = widget.x * window_size[0] + y = widget.y * window_size[0] + elif widget.is_window_relative == 1: + x = widget.x * window_size[1] + y = widget.y * window_size[1] + elif widget.is_window_relative == 2: + x = widget.x * window_size[0] + y = widget.y * window_size[1] + else: + x = widget.x + y = widget.y + + # On vérifie quel est le widget + if isinstance(widget, Label): + # 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)) + rendered_text = text_font.render(widget.text, True, widget.color) + if widget.centered: + self.window.blit(rendered_text, (x-rendered_text.get_width()//2, + y-rendered_text.get_height()//2)) + else: + self.window.blit(rendered_text, (x, y)) + 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 414b3a2..ad30c2c 100644 --- a/src/main.py +++ b/src/main.py @@ -4,6 +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 class Game(Engine): @@ -28,6 +29,16 @@ class Game(Engine): self.event_handler.register_button_area((0, 0, 0.1, 0.1), lambda : print("salut"), 0) + self.setup_main_menu() + + def setup_main_menu(self): + """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)) + self.menu_manager.register_menu(menu, "main") + + self.menu_manager.show("main") + def create_player_entity(self): """Crée une entité joueur.""" anim = Anim(0.5)