From 1e405d861f157078e9fd18c8b12a8f82cb4466c0 Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 6 Jan 2024 20:56:35 +0100 Subject: [PATCH 01/12] Ajout d'un gestionnaire de menu --- src/engine/menu_manager.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/engine/menu_manager.py diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py new file mode 100644 index 0000000..6026668 --- /dev/null +++ b/src/engine/menu_manager.py @@ -0,0 +1,4 @@ +class MenuManager: + """Classe qui gère les menus.""" + def __init__(self): + pass \ No newline at end of file -- 2.43.4 From 0f617c409b08956b7eb3c6dbfb4306d9d35f6726 Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 11:47:53 +0100 Subject: [PATCH 02/12] Ajout du premier menu et du premier widget --- src/engine/menu_manager.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py index 6026668..fabd488 100644 --- a/src/engine/menu_manager.py +++ b/src/engine/menu_manager.py @@ -1,4 +1,37 @@ +class Widget: + """Classe parente des widgets de menu.""" + def __init__(self, x, y, is_window_relative): + self.x = x + self.y = y + self.is_window_relative = is_window_relative + + +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): + super().__init__(x, y, is_window_relative) + self.text = text + self.size = size + self.centered = centered + + +class Menu: + """Un menu contenant des widgets.""" + def __init__(self): + self.widgets: list[Widget] = [] + + def add_widget(self, widget: Widget): + """Ajoute le widget donné au menu.""" + self.widgets.append(widget) + + class MenuManager: """Classe qui gère les menus.""" + def __init__(self): - pass \ No newline at end of file + self.menus = {} + + def register_menu(self, menu: Menu, name: str): + """Ajoute le menu donné au manager de menu avec le nom donné.""" + self.menus[name] = menu -- 2.43.4 From 43be50f410e15c80601da995830561422dddc811 Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 11:51:47 +0100 Subject: [PATCH 03/12] Suppression de l'ancien code du main menu dans le renderer --- src/engine/renderer.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 804fa29..fe898fc 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -30,9 +30,6 @@ class Renderer: # Boite de dialogue self.dialogs_box = None - # Variables utilisées par le menu principal - self.main_menu_assets: dict[str: Anim] = {} - # Ombres d'entités self.shadows = {} @@ -68,9 +65,6 @@ class Renderer: # Le 0 correspond au temps de vie depuis la création de la particule self.particles.append([part_x, part_y, part_size, part_speed_x, part_speed_y, 0., part_life_time, color]) - def load_main_menu_assets(self, path: str): - """Charge les assets du menu principal depuis le dossier donné.""" - def load_tile_set(self, file_path: str, tile_size: int): """Charge le jeu de tuiles en utilisant le fichier donné et la taille donnée.""" tile_set = image.load(file_path).convert_alpha() @@ -362,9 +356,6 @@ class Renderer: entity.collision_rect[3] - entity.collision_rect[1]), width=1) - def render_main_menu(self): - """Rend le menu principal du jeu.""" - def render_layer(self, layer_id: int, rendered_surface: surface.Surface): """Rend la map.""" # On calcule le nombre de tiles à mettre sur notre écran en prenant en compte le zoom -- 2.43.4 From 51c20b5e674079a2fcb14b977c53784821733ab4 Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 12:14:00 +0100 Subject: [PATCH 04/12] Ajout de la redimension automatique des labels --- src/engine/engine.py | 2 ++ src/engine/menu_manager.py | 14 ++++++++++-- src/engine/renderer.py | 45 ++++++++++++++++++++++++++++++++++++++ src/main.py | 11 ++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) 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) -- 2.43.4 From 39636498812a72779ea84377cc1d578496eaf11b Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 17:05:50 +0100 Subject: [PATCH 05/12] 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") -- 2.43.4 From 745a182ec89563daf3e5c5200df4d70d3a16ede9 Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 17:06:26 +0100 Subject: [PATCH 06/12] Ajout d'une image de bouton --- assets/textures/GUI/button_1.png | Bin 0 -> 1426 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/textures/GUI/button_1.png diff --git a/assets/textures/GUI/button_1.png b/assets/textures/GUI/button_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2373576dfc935010049db78bbf02da9c32b7c6e7 GIT binary patch literal 1426 zcmb_c`BM^j9Q{I~Vd1eJ9qW)fZh31CYF3C99$=EWYQvbs=CNv~6lskYjIFDQrfXv* zq?xAWkr%8QqUkcJZIWjkl4%}fDPp1+E7`LD!~XC&-h4j4yqWjjtzd#bLVv$L004mt zz=i+-(XPN}r>?edMAr3a2ZS2pe-bpkvG}9~I=`L>Isrgy(Jsv|FfE2t0*F)q4EX;Q zWFYxzGyt$eIP8hg8zlMEbl_Bq#lV*i48;_`$H2y}3|B%hFqOpl=1>{^T%%~_6gKBR z!D zWkxR})B7P?I=qz8gLxBv(6bq*d?2f=4I8g~?*DTWgmURIN`!imAakcOsm#Z*qSOdb z%0vp_g1L53X%jh85ZCX{Y7ZVt(w`v;jxlqy_t9;?5|wxR2{4$M1HB8SNFX6%LDk|Z z!H>*8$#<)RArtZ5qT~CA09LZejACN4B?fB!UXSnRm@=~N41waSK>5 z^h|uxd4qZLUOi^ENP|EiuCC4Fys|W%p`oFjVW2}Q6y7~eApE_$+T!T!%zexA9^;iD zWB1UfA}@y-r}2lI)Gj36VC#WA%Pxz&mltzZ;28~GWQ77# z`D!bzd1^IExnndmGScY@q5LYlcmQQM37<(3q_?--L4OXk`Qe>h&)TsRkE2ql6tCg| zRw}gR!bXmmn&p8py1cNkFea5Q#aih-1IvfHtyCq3^u?vcMM`yXxC7Wi)AG7M=vn@w zQcNrStTrWRx>L~N0i{?hp4lMH7?6|U=Hl0O4s`kY5veNmeGD)TT|`%mcwzu87|;i7 zL2r~Pm^rKuR`N`j(pws+tE$1R~^oU=iEN#ih%b zZW}=)Ua2mA(FmGq2PDps+<8Ax)i_A%Nq`k^j(_?T?+G=E@l~zGIM9>F<`PXzOiJ(z z-DqHGooHB8SooYc_`t09xt7=LY?W3ST&;?aQe_1;cW|D&ydq?}dr*2~d>YEb1AiQO z@AKz`4ydKQP$;x9XPDX36)1Ts)K$@iVTf7{}Z`g;2g z{mO~PrY1a%Mr#!$lg2dBH%~+MUdquG@cSHd%XOBME@ozSb2yv;B2lJ-(4~SE)tR6m z-1X}nLqkKIT4j&&%8~i=E3;kh7cL>;u`raoJ1#l7`P#K>0TB_b384`0`|^!5WR=z? zN|z%r>90O&)XKi7Ev)qiZ>L3nfr-|&wQHG$(+%p7af>1F4!-=`_X1f5Sr%OZU0(0% z-<~z>+wC(U@ubBmSs5^LqfW&{hV~I#8mW}FVmRucM^M+)^3^ukeObN}$lHBv4b$9u zY}>O*O_i&{vugU0#uXzRDU@Cko%~f2=>0IkBk|FFn$mGN$pHD*VuBO5BASTHFFy!0 q9qsP4gyoN#d)hc+Gg(KTF*JxB`|JWsc^*F690fRE0=DTSIs0G7W~s>l literal 0 HcmV?d00001 -- 2.43.4 From 21aa1c9768ec6281aac8a697b9bb6c563dca54c8 Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 17:58:24 +0100 Subject: [PATCH 07/12] Ajout de la redimension automatique des boutons et hover --- src/engine/engine.py | 2 +- src/engine/event_handler.py | 10 ++++++++-- src/engine/menu_manager.py | 29 +++++++++++++++++++++++++---- src/engine/renderer.py | 23 ++++++++++++++++------- src/main.py | 2 +- 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/engine/engine.py b/src/engine/engine.py index ce18718..0b86865 100644 --- a/src/engine/engine.py +++ b/src/engine/engine.py @@ -36,7 +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() + self.menu_manager = MenuManager(self) def loop(self): """Fonction à lancer au début du programme et qui va lancer les updates dans une boucle. diff --git a/src/engine/event_handler.py b/src/engine/event_handler.py index c4c976d..242f2b8 100644 --- a/src/engine/event_handler.py +++ b/src/engine/event_handler.py @@ -14,6 +14,7 @@ class EventHandler: self.engine = core self.key_pressed = [] self.buttons_area = [] + self.hovered_area = [] @staticmethod def get_click_collision(rect: tuple[float | int, float | int, float | int, float | int], point: tuple[int, int], @@ -37,11 +38,12 @@ class EventHandler: def register_button_area(self, rect: tuple[float | int, float | int, float | int, float | int], callback: FunctionType | classmethod | staticmethod, name: str, - is_window_relative: int = -1): + is_window_relative: int = -1, + hover_callback: FunctionType | classmethod | staticmethod = None): """Enregistre une zone comme bouton. La fonction donnée sera donc executé lorsque la zone sur la fenêtre sera cliqué. is_window_relative doit être 0 pour que le rect soit multipliée par la largeur de la fenêtre et 1 pour qu'elle soit multipliée par la hauteur""" - self.buttons_area.append((rect, callback, is_window_relative, name)) + self.buttons_area.append((rect, callback, is_window_relative, name, hover_callback)) def remove_button_area(self, name: str): """Supprime les boutons aux noms donnés.""" @@ -72,6 +74,10 @@ class EventHandler: for area in self.buttons_area: if self.get_click_collision(area[0], e.pos, area[2]): area[1]() + elif e.type == MOUSEMOTION: + for area in self.buttons_area: + if area[4] is not None and self.get_click_collision(area[0], e.pos, area[2]): + area[4]() if self.engine.entity_manager.player_entity_name: if K_RIGHT in self.key_pressed: diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py index 27929fa..44dcb1f 100644 --- a/src/engine/menu_manager.py +++ b/src/engine/menu_manager.py @@ -1,9 +1,9 @@ -import threading -import tkinter from types import FunctionType import pygame +import src.engine.engine + class Widget: """Classe parente des widgets de menu.""" @@ -28,7 +28,8 @@ 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): + hover_image: pygame.Surface, centered: bool = False, is_window_relative: int = -1, + area_name: str = "menu_button"): super().__init__(x, y, is_window_relative) self.text = text self.size = size @@ -37,6 +38,11 @@ class Button(Widget): self.base_image = base_image self.hover_image = hover_image self.centered = centered + self.area_name = area_name + self.hovered = False + + def set_hover_state(self, state: bool): + self.hovered = state class Menu: @@ -52,14 +58,29 @@ class Menu: class MenuManager: """Classe qui gère les menus.""" - def __init__(self): + def __init__(self, engine: 'src.engine.engine.Engine'): self.menus = {} self.active_menu: Menu | None = None + self.engine = engine def register_menu(self, menu: Menu, name: str): """Ajoute le menu donné au manager de menu avec le nom donné.""" self.menus[name] = menu + # On itère dans tous les bouttons pour leur ajouter une interaction + for btn in menu.widgets: + if isinstance(btn, Button): + width = btn.base_image.get_width()/self.engine.renderer.window_size[0] + height = btn.base_image.get_height()/self.engine.renderer.window_size[1] + area_x = btn.x + area_y = btn.y + if btn.centered: + area_x -= width/2 + area_y -= height/2 + self.engine.event_handler.register_button_area((area_x, area_y, width, height), btn.callback, btn.area_name, + btn.is_window_relative, lambda: print("hover")) + print(btn.is_window_relative) + def show(self, name: str): """Affiche le menu au nom donné.""" self.active_menu = self.menus[name] diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 7d13849..894cafb 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -191,7 +191,6 @@ class Renderer: 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] @@ -204,14 +203,24 @@ class Renderer: 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)) + btn_image = widget.base_image + btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0], + btn_image.get_height()*window_size[0]/self.window_size[0])) + + # On affiche l'image du boutton + if widget.centered: + self.window.blit(btn_image, (x-btn_image.get_width()//2, + y-btn_image.get_height()//2)) + + self.window.blit(rendered_text, (x-rendered_text.get_width()//2, + y-rendered_text.get_height()//2)) + + else: + self.window.blit(btn_image, (x, y)) + + 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 ec16d23..d505fbb 100644 --- a/src/main.py +++ b/src/main.py @@ -38,7 +38,7 @@ class Game(Engine): 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)) + menu.add_widget(Button(0.5, 0.3, "boutton", 0.1, (0, 255, 0), lambda : print("play"), base_image, base_image, True, 0)) self.menu_manager.register_menu(menu, "main") self.menu_manager.show("main") -- 2.43.4 From 82f8b692fbffbe7c6853e8545f6f27911625f3ee Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 18:11:28 +0100 Subject: [PATCH 08/12] Ajout du hover du bouton --- src/engine/event_handler.py | 11 +++++++++-- src/engine/menu_manager.py | 4 ++-- src/engine/renderer.py | 5 ++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/engine/event_handler.py b/src/engine/event_handler.py index 242f2b8..1568ed0 100644 --- a/src/engine/event_handler.py +++ b/src/engine/event_handler.py @@ -76,8 +76,15 @@ class EventHandler: area[1]() elif e.type == MOUSEMOTION: for area in self.buttons_area: - if area[4] is not None and self.get_click_collision(area[0], e.pos, area[2]): - area[4]() + if area[4] is not None: + if self.get_click_collision(area[0], e.pos, area[2]): + if area not in self.hovered_area: + area[4](True) + self.hovered_area.append(area) + else: + if area in self.hovered_area: + area[4](False) + self.hovered_area.remove(area) if self.engine.entity_manager.player_entity_name: if K_RIGHT in self.key_pressed: diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py index 44dcb1f..062e181 100644 --- a/src/engine/menu_manager.py +++ b/src/engine/menu_manager.py @@ -42,6 +42,7 @@ class Button(Widget): self.hovered = False def set_hover_state(self, state: bool): + """Modifie la valeur du hover.""" self.hovered = state @@ -78,8 +79,7 @@ class MenuManager: area_x -= width/2 area_y -= height/2 self.engine.event_handler.register_button_area((area_x, area_y, width, height), btn.callback, btn.area_name, - btn.is_window_relative, lambda: print("hover")) - print(btn.is_window_relative) + btn.is_window_relative, btn.set_hover_state) def show(self, name: str): """Affiche le menu au nom donné.""" diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 894cafb..89a0126 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -205,7 +205,10 @@ class Renderer: rendered_text = text_font.render(widget.text, True, widget.color) - btn_image = widget.base_image + if widget.hovered: + btn_image = widget.base_image + else: + btn_image = widget.hover_image btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0], btn_image.get_height()*window_size[0]/self.window_size[0])) -- 2.43.4 From cc77957b31a72d7fe35bdd9b3595784b61c966d0 Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 18:15:37 +0100 Subject: [PATCH 09/12] Ajout du hover du bouton actuel --- assets/textures/GUI/button_2.png | Bin 0 -> 1392 bytes src/engine/renderer.py | 4 ++-- src/main.py | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 assets/textures/GUI/button_2.png diff --git a/assets/textures/GUI/button_2.png b/assets/textures/GUI/button_2.png new file mode 100644 index 0000000000000000000000000000000000000000..600a10c5ac1809a2150fe1d5eea883b364715dcf GIT binary patch literal 1392 zcmcJP|34FW9LGN!o3%xkJSbYL^q}014jC8oKL8MI3)~QJZB~X>b!ZEO=I`YJ9u94v(F)xt_ap8A)MumC!eLsyA)XjW1HhpB zOF*7eD&-zpWpKM+{Sa;Ze58MD*E*2Rg2YutGw zc23Uxx`mi=>cj?JV>X;crOG2!D_7;KiXkk!?&g~m28*R}=~ei;drBp9r%ajR1%XX) zdQHRC^wAiw%P50Tnmb9}^J=v>Vkxe|UtHfZnv9gXj%!|!Adc{IUCKtQOC{!R4tE*B z&B!pxxZm_J50{shN7t3s-Rh4#hBcN&J35UD_zew9`RMgv@aZ1`{Y9a`Z*PH6cr>p! zVw4Q7)dbbv5s5^f&YwLi9D=`!f;N~H%;PsjV<4@*tJ-ZeaZ-z%XuqPFs$jbV2OR7>9UHAXizE{?OPv#YGIxVZRH8B@!qY~`Xk z<(a5zUWrN>j$tnf=VR0KszkBV&WhXUWubAnQm<>~-dbP1CKvaf%utu`L>L5aFdolq zDWl|mZo=yz%EOkvOdYW+B0Z2*j&(vo{Mu2#?%oSJ!;OG+KN7@mg#pJ*DA;}o0u0Ik zxc0wdeJnfS$(d?VH5!62A6!(cThYo7cLq<3nF~j;#)Gr7UqNkf%X}p_g7xO-M?oX9 z$Jxz#e6X{~o-dI|=zmeQzH2qfe$JIW9-f%kttI95d>r*{QyDXZFu}p=oQSnItr$8k zkhD-6QNZJnU5yw`uw{|04>Pr{b7H7JlJ*#0sHN46r0Q)NDD%qpvC4n>tgaDotn@Wm zX1IaAzU##^mKOvKZEbDu=G>4{o0u!84*3H~BCqbrlNbjF2cH^|ttF}G9)fL7ObxTj zAN5)eALst2*^zbV_t^=Z=rXs}87Ri0MTa`CLG^ z#)!f#U7@%-TZ8<;(_=S7JGpen<9Hr!=A1MQ(y1Yieb|&NTHX`*&h@6}y4gOqK6=@R zy#S>rCc5Uxo<<&oNeiMK?(+UTS?|jqC(EKhXtD*-BCp>cx;ZApM0?9QD5PL^9}s;9 z5nHXHGYCk!sT*;oIgGC4xo%^M$e^#oG$b#ZWpA2QE?*r!w*U|*#;A?BeK$&#?LJO+ z83vbMx9FHmomf=#^z;NC)R(5ev{Ch3XC2`v1RIgekxQ@_6`nh}s-RjrDQGIU$TA5A swr^H<@Aw=iV78Of4(q`L-32T_ALu=okeQIA{gS}jlSFvv@zdr10N`PVYXATM literal 0 HcmV?d00001 diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 89a0126..e4a7558 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -206,9 +206,9 @@ class Renderer: rendered_text = text_font.render(widget.text, True, widget.color) if widget.hovered: - btn_image = widget.base_image - else: btn_image = widget.hover_image + else: + btn_image = widget.base_image btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0], btn_image.get_height()*window_size[0]/self.window_size[0])) diff --git a/src/main.py b/src/main.py index d505fbb..4746e4c 100644 --- a/src/main.py +++ b/src/main.py @@ -37,8 +37,9 @@ class Game(Engine): 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() + hover_image = pygame.image.load("assets/textures/GUI/button_2.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, 0)) + menu.add_widget(Button(0.5, 0.3, "boutton", 0.1, (0, 255, 0), lambda : print("play"), base_image, hover_image, True, 0)) self.menu_manager.register_menu(menu, "main") self.menu_manager.show("main") -- 2.43.4 From fe2c07b5ace437b119de3200c89db97aefb9da36 Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 18:29:18 +0100 Subject: [PATCH 10/12] Ajout du menu principal --- src/engine/menu_manager.py | 31 ++++++++++++++++++------------- src/engine/renderer.py | 12 ++++++++++-- src/main.py | 8 ++++++-- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py index 062e181..e972a35 100644 --- a/src/engine/menu_manager.py +++ b/src/engine/menu_manager.py @@ -68,23 +68,28 @@ class MenuManager: """Ajoute le menu donné au manager de menu avec le nom donné.""" self.menus[name] = menu - # On itère dans tous les bouttons pour leur ajouter une interaction - for btn in menu.widgets: - if isinstance(btn, Button): - width = btn.base_image.get_width()/self.engine.renderer.window_size[0] - height = btn.base_image.get_height()/self.engine.renderer.window_size[1] - area_x = btn.x - area_y = btn.y - if btn.centered: - area_x -= width/2 - area_y -= height/2 - self.engine.event_handler.register_button_area((area_x, area_y, width, height), btn.callback, btn.area_name, - btn.is_window_relative, btn.set_hover_state) - def show(self, name: str): """Affiche le menu au nom donné.""" self.active_menu = self.menus[name] + # On itère dans tous les bouttons pour leur ajouter une interaction + for btn in self.active_menu.widgets: + if isinstance(btn, Button): + width = btn.base_image.get_width() / self.engine.renderer.window_size[0] + height = btn.base_image.get_height() / self.engine.renderer.window_size[1] + area_x = btn.x + area_y = btn.y + if btn.centered: + area_x -= width / 2 + area_y -= height / 2 + self.engine.event_handler.register_button_area((area_x, area_y, width, height), btn.callback, + btn.area_name, + btn.is_window_relative, btn.set_hover_state) + def hide(self): """Affiche le menu actuelement à l'écran.""" + # On itère dans tous les bouttons pour retirer l'interaction + for btn in self.active_menu.widgets: + if isinstance(btn, Button): + self.engine.event_handler.remove_button_area(btn.area_name) self.active_menu = None diff --git a/src/engine/renderer.py b/src/engine/renderer.py index e4a7558..5e53da0 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -209,8 +209,16 @@ class Renderer: btn_image = widget.hover_image else: btn_image = widget.base_image - btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0], - btn_image.get_height()*window_size[0]/self.window_size[0])) + + if widget.is_window_relative == 0: + btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0], + btn_image.get_height()*window_size[0]/self.window_size[0])) + elif widget.is_window_relative == 1: + btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[1]/self.window_size[1], + btn_image.get_height()*window_size[1]/self.window_size[1])) + elif widget.is_window_relative == 2: + btn_image = transform.scale(btn_image, (btn_image.get_width()*window_size[0]/self.window_size[0], + btn_image.get_height()*window_size[1]/self.window_size[1])) # On affiche l'image du boutton if widget.centered: diff --git a/src/main.py b/src/main.py index 4746e4c..4e156ed 100644 --- a/src/main.py +++ b/src/main.py @@ -21,7 +21,7 @@ class Game(Engine): self.DEBUG_MODE = True - self.game_state = GameState.NORMAL + self.game_state = GameState.MAIN_MENU self.event_sheduler.register_area((64, 64, 32, 32), lambda _: self.dialogs_manager.start_dialog("test"), ["player"], False, True) @@ -31,6 +31,10 @@ class Game(Engine): self.setup_main_menu() + def start_game(self): + self.game_state = GameState.NORMAL + self.menu_manager.hide() + def setup_main_menu(self): """Crée les éléments du menu principal.""" menu = Menu() @@ -39,7 +43,7 @@ class Game(Engine): 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() - menu.add_widget(Button(0.5, 0.3, "boutton", 0.1, (0, 255, 0), lambda : print("play"), base_image, hover_image, True, 0)) + menu.add_widget(Button(0.5, 0.3, "play", 0.08, (0, 255, 0), self.start_game, base_image, hover_image, True, 0)) self.menu_manager.register_menu(menu, "main") self.menu_manager.show("main") -- 2.43.4 From 059559a474589805675f84d0db70185ababc50fb Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 18:30:39 +0100 Subject: [PATCH 11/12] Changement du type d'adaptation du titre du jeu --- src/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.py b/src/main.py index 4e156ed..8910a5f 100644 --- a/src/main.py +++ b/src/main.py @@ -38,7 +38,7 @@ class Game(Engine): 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)) + menu.add_widget(Label(0.5, 0.1, "The Forest's Secret", 0.1, (0, 255, 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() -- 2.43.4 From 85801350028468b760971606e862be91d6a6e080 Mon Sep 17 00:00:00 2001 From: Yannis300307 Date: Sun, 7 Jan 2024 18:35:18 +0100 Subject: [PATCH 12/12] Changement du texte en noir --- src/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.py b/src/main.py index 8910a5f..24ccfbd 100644 --- a/src/main.py +++ b/src/main.py @@ -38,12 +38,12 @@ class Game(Engine): 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, 0)) + 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() - menu.add_widget(Button(0.5, 0.3, "play", 0.08, (0, 255, 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)) self.menu_manager.register_menu(menu, "main") self.menu_manager.show("main") -- 2.43.4