ADD settings menu to main game with go back feature

This commit is contained in:
2025-04-21 12:27:02 +02:00
parent 69cae0044a
commit 6b6532031b
6 changed files with 48 additions and 4 deletions

View File

@@ -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)
self.slider.handle_event(event)
self.settings_button.handle_event(event)

View File

@@ -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)

View File

@@ -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()

View File

@@ -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):

View File

@@ -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))

22
utils/stack.py Normal file
View File

@@ -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)