ADD settings menu to main game with go back feature
This commit is contained in:
@@ -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)
|
||||
8
main.py
8
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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
22
utils/stack.py
Normal 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)
|
||||
Reference in New Issue
Block a user