From 6b6532031b4f41556808e692fa54ffdec1b9f4fb Mon Sep 17 00:00:00 2001 From: ThisBirchWood Date: Mon, 21 Apr 2025 12:27:02 +0200 Subject: [PATCH] ADD settings menu to main game with go back feature --- controllers/gui_controller.py | 9 +++++++-- main.py | 8 ++++++++ render/gui_renderer.py | 9 +++++++++ states/game.py | 2 +- states/settings_menu.py | 2 +- utils/stack.py | 22 ++++++++++++++++++++++ 6 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 utils/stack.py diff --git a/controllers/gui_controller.py b/controllers/gui_controller.py index 0f53e0a..d9103b0 100644 --- a/controllers/gui_controller.py +++ b/controllers/gui_controller.py @@ -1,9 +1,14 @@ from render.gui_renderer import GUIRenderer class GUIController: - def __init__(self, gui_renderer: GUIRenderer): + def __init__(self, gui_renderer: GUIRenderer, callback_function): + self.callback_function = callback_function + self.gui_renderer = gui_renderer self.slider = gui_renderer.slider + self.settings_button = gui_renderer.settings_button + self.settings_button.set_action(lambda: self.callback_function("settings_menu")) def update(self, event): - self.slider.handle_event(event) \ No newline at end of file + self.slider.handle_event(event) + self.settings_button.handle_event(event) \ No newline at end of file diff --git a/main.py b/main.py index 5afd4ef..0661d4e 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ import pygame from states.game import Game from states.start_menu import StartMenu from states.settings_menu import SettingsMenu +from utils.stack import Stack def main(): pygame.init() @@ -13,6 +14,7 @@ def main(): context = { "match": None, "screen": screen, + "previous_states": Stack(), "font": pygame.font.Font(None, 36), "small_font": pygame.font.Font(None, 15), "options": { @@ -22,9 +24,12 @@ def main(): } current_state = None + current_state_name = None def switch_state(state_name): nonlocal current_state + nonlocal current_state_name + if state_name == "game": # Initialize Game state here try: @@ -35,7 +40,10 @@ def main(): current_state = Game(switch_state, context) states[state_name] = current_state + context["previous_states"].push(current_state_name) + current_state = states[state_name] + current_state_name = state_name # Initialize states states["start_menu"] = StartMenu(switch_state, context) diff --git a/render/gui_renderer.py b/render/gui_renderer.py index 7f61c33..b49dc26 100644 --- a/render/gui_renderer.py +++ b/render/gui_renderer.py @@ -1,5 +1,6 @@ import pygame from widgets.slider import HorizontalSlider +from widgets.button import Button class GUIRenderer: def __init__(self, screen, match): @@ -8,6 +9,10 @@ class GUIRenderer: self.match = match self.slider = HorizontalSlider(self.screen, 50, 650, self.screen.get_width()-100, 20, 1, self.match.max_tick) + + # Settings button + self.settings_button = Button(self.screen.get_width()-40, 10, 30, 30, None) + self.settings_button.set_text("Settings") self.colour = (255, 255, 255) @@ -19,6 +24,9 @@ class GUIRenderer: text = self.font.render(f"Score: {team_1_score} - {team_2_score}", True, self.colour) self.screen.blit(text, (10, 40)) + def _render_settings_button(self): + self.settings_button.draw(self.screen) + def _render_slider(self): # Update slider value if self.slider.dragging: @@ -32,4 +40,5 @@ class GUIRenderer: def render(self): self._render_current_tick(self.match.tick, self.match.max_tick) self._render_team_scores(self.match.team_1.score, self.match.team_2.score) + self._render_settings_button() self._render_slider() diff --git a/states/game.py b/states/game.py index 3db8165..8ba5d3b 100644 --- a/states/game.py +++ b/states/game.py @@ -24,7 +24,7 @@ class Game(GameState): # Controllers self.player_controller = PlayerController(self.player_renderer, self.match) - self.gui_controller = GUIController(self.gui_render) + self.gui_controller = GUIController(self.gui_render, self.switch_state) def handle_events(self, events): diff --git a/states/settings_menu.py b/states/settings_menu.py index 1a11dd0..6e9b919 100644 --- a/states/settings_menu.py +++ b/states/settings_menu.py @@ -8,7 +8,7 @@ class SettingsMenu(GameState): super().__init__(switch_state_callback, context) # Buttons - self.back_button = Button(10, 10, 50, 50, lambda: self.switch_state("start_menu")) + self.back_button = Button(10, 10, 50, 50, lambda: self.switch_state(self.context["previous_states"].pop())) self.back_button.set_text("Back") self.show_yaw_text = self.font.render("Show Yaw: ", True, (255, 255, 255)) diff --git a/utils/stack.py b/utils/stack.py new file mode 100644 index 0000000..be8a28c --- /dev/null +++ b/utils/stack.py @@ -0,0 +1,22 @@ +class Stack: + def __init__(self): + self.stack = [] + + def push(self, item): + self.stack.append(item) + + def pop(self): + if not self.is_empty(): + return self.stack.pop() + raise IndexError("pop from empty stack") + + def peek(self): + if not self.is_empty(): + return self.stack[-1] + raise IndexError("peek from empty stack") + + def is_empty(self): + return len(self.stack) == 0 + + def size(self): + return len(self.stack) \ No newline at end of file