Ajout de la redimension automatique des labels

This commit is contained in:
Yannis 2024-01-07 12:14:00 +01:00
parent 43be50f410
commit 51c20b5e67
Signed by: yannis
SSH key fingerprint: SHA256:Bz8K8QiTYUudf8MlthTM9MCLfgiYf/U1md3V9g9Wo14
4 changed files with 70 additions and 2 deletions

View file

@ -5,6 +5,7 @@ from src.engine.entity_manager import EntityManager
from src.engine.event_handler import EventHandler from src.engine.event_handler import EventHandler
from src.engine.event_sheduler import EventSheduler from src.engine.event_sheduler import EventSheduler
from src.engine.map_manager import MapManager from src.engine.map_manager import MapManager
from src.engine.menu_manager import MenuManager
from src.engine.renderer import Renderer from src.engine.renderer import Renderer
from src.engine.enums import GameState from src.engine.enums import GameState
import pygame import pygame
@ -35,6 +36,7 @@ class Engine:
self.boss_fight_manager = BossFightManager(self) self.boss_fight_manager = BossFightManager(self)
self.event_sheduler = EventSheduler(self) self.event_sheduler = EventSheduler(self)
self.dialogs_manager = DialogsManager(self.event_handler) self.dialogs_manager = DialogsManager(self.event_handler)
self.menu_manager = MenuManager()
def loop(self): def loop(self):
"""Fonction à lancer au début du programme et qui va lancer les updates dans une boucle. """Fonction à lancer au début du programme et qui va lancer les updates dans une boucle.

View file

@ -8,12 +8,13 @@ class Widget:
class Label(Widget): class Label(Widget):
"""Un widget de texte.""" """Un widget de texte."""
def __init__(self, x: int | float, y: int | float, text: str, size: int | float, centered: bool = False, def __init__(self, x: int | float, y: int | float, text: str, size: int | float, color: tuple[int, int, int],
is_window_relative: bool = -1): centered: bool = False, is_window_relative: bool = -1):
super().__init__(x, y, is_window_relative) super().__init__(x, y, is_window_relative)
self.text = text self.text = text
self.size = size self.size = size
self.centered = centered self.centered = centered
self.color = color
class Menu: class Menu:
@ -31,7 +32,16 @@ class MenuManager:
def __init__(self): def __init__(self):
self.menus = {} self.menus = {}
self.active_menu: Menu | None = None
def register_menu(self, menu: Menu, name: str): def register_menu(self, menu: Menu, name: str):
"""Ajoute le menu donné au manager de menu avec le nom donné.""" """Ajoute le menu donné au manager de menu avec le nom donné."""
self.menus[name] = menu 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

View file

@ -7,6 +7,7 @@ from pygame.locals import RESIZABLE, SRCALPHA, FULLSCREEN
import src.engine.engine as engine import src.engine.engine as engine
from src.engine.animation import Anim from src.engine.animation import Anim
from src.engine.enums import GameState from src.engine.enums import GameState
from src.engine.menu_manager import Label
class Renderer: class Renderer:
@ -111,6 +112,9 @@ class Renderer:
self.render_boss_fight_scene(delta) self.render_boss_fight_scene(delta)
self.render_boss_fight_gui() self.render_boss_fight_gui()
# Rend les menus
self.render_menus()
# Conteur de FPS en mode DEBUG # Conteur de FPS en mode DEBUG
if self.engine.DEBUG_MODE: if self.engine.DEBUG_MODE:
self.window.blit(font.SysFont("Arial", 20).render(f"FPS: {self.engine.clock.get_fps()}", True, (255, 0, 0)), 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 # Apres avoir tout rendu, on met à jour l'écran
display.update() 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): def render_dialogs_box(self):
"""Rend la boite de dialogue lorsqu'un dialogue est lancé.""" """Rend la boite de dialogue lorsqu'un dialogue est lancé."""

View file

@ -4,6 +4,7 @@ from src.custom_AI import WolfAI
from src.engine.animation import Anim from src.engine.animation import Anim
from src.engine.engine import Engine from src.engine.engine import Engine
from src.engine.enums import GameState from src.engine.enums import GameState
from src.engine.menu_manager import Menu, Label
class Game(Engine): 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.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): def create_player_entity(self):
"""Crée une entité joueur.""" """Crée une entité joueur."""
anim = Anim(0.5) anim = Anim(0.5)