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
|
from render.gui_renderer import GUIRenderer
|
||||||
|
|
||||||
class GUIController:
|
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.gui_renderer = gui_renderer
|
||||||
self.slider = gui_renderer.slider
|
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):
|
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.game import Game
|
||||||
from states.start_menu import StartMenu
|
from states.start_menu import StartMenu
|
||||||
from states.settings_menu import SettingsMenu
|
from states.settings_menu import SettingsMenu
|
||||||
|
from utils.stack import Stack
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
pygame.init()
|
pygame.init()
|
||||||
@@ -13,6 +14,7 @@ def main():
|
|||||||
context = {
|
context = {
|
||||||
"match": None,
|
"match": None,
|
||||||
"screen": screen,
|
"screen": screen,
|
||||||
|
"previous_states": Stack(),
|
||||||
"font": pygame.font.Font(None, 36),
|
"font": pygame.font.Font(None, 36),
|
||||||
"small_font": pygame.font.Font(None, 15),
|
"small_font": pygame.font.Font(None, 15),
|
||||||
"options": {
|
"options": {
|
||||||
@@ -22,9 +24,12 @@ def main():
|
|||||||
}
|
}
|
||||||
|
|
||||||
current_state = None
|
current_state = None
|
||||||
|
current_state_name = None
|
||||||
|
|
||||||
def switch_state(state_name):
|
def switch_state(state_name):
|
||||||
nonlocal current_state
|
nonlocal current_state
|
||||||
|
nonlocal current_state_name
|
||||||
|
|
||||||
if state_name == "game":
|
if state_name == "game":
|
||||||
# Initialize Game state here
|
# Initialize Game state here
|
||||||
try:
|
try:
|
||||||
@@ -35,7 +40,10 @@ def main():
|
|||||||
current_state = Game(switch_state, context)
|
current_state = Game(switch_state, context)
|
||||||
states[state_name] = current_state
|
states[state_name] = current_state
|
||||||
|
|
||||||
|
context["previous_states"].push(current_state_name)
|
||||||
|
|
||||||
current_state = states[state_name]
|
current_state = states[state_name]
|
||||||
|
current_state_name = state_name
|
||||||
|
|
||||||
# Initialize states
|
# Initialize states
|
||||||
states["start_menu"] = StartMenu(switch_state, context)
|
states["start_menu"] = StartMenu(switch_state, context)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import pygame
|
import pygame
|
||||||
from widgets.slider import HorizontalSlider
|
from widgets.slider import HorizontalSlider
|
||||||
|
from widgets.button import Button
|
||||||
|
|
||||||
class GUIRenderer:
|
class GUIRenderer:
|
||||||
def __init__(self, screen, match):
|
def __init__(self, screen, match):
|
||||||
@@ -9,6 +10,10 @@ class GUIRenderer:
|
|||||||
|
|
||||||
self.slider = HorizontalSlider(self.screen, 50, 650, self.screen.get_width()-100, 20, 1, self.match.max_tick)
|
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)
|
self.colour = (255, 255, 255)
|
||||||
|
|
||||||
def _render_current_tick(self, match_tick, max_tick):
|
def _render_current_tick(self, match_tick, max_tick):
|
||||||
@@ -19,6 +24,9 @@ class GUIRenderer:
|
|||||||
text = self.font.render(f"Score: {team_1_score} - {team_2_score}", True, self.colour)
|
text = self.font.render(f"Score: {team_1_score} - {team_2_score}", True, self.colour)
|
||||||
self.screen.blit(text, (10, 40))
|
self.screen.blit(text, (10, 40))
|
||||||
|
|
||||||
|
def _render_settings_button(self):
|
||||||
|
self.settings_button.draw(self.screen)
|
||||||
|
|
||||||
def _render_slider(self):
|
def _render_slider(self):
|
||||||
# Update slider value
|
# Update slider value
|
||||||
if self.slider.dragging:
|
if self.slider.dragging:
|
||||||
@@ -32,4 +40,5 @@ class GUIRenderer:
|
|||||||
def render(self):
|
def render(self):
|
||||||
self._render_current_tick(self.match.tick, self.match.max_tick)
|
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_team_scores(self.match.team_1.score, self.match.team_2.score)
|
||||||
|
self._render_settings_button()
|
||||||
self._render_slider()
|
self._render_slider()
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class Game(GameState):
|
|||||||
|
|
||||||
# Controllers
|
# Controllers
|
||||||
self.player_controller = PlayerController(self.player_renderer, self.match)
|
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):
|
def handle_events(self, events):
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class SettingsMenu(GameState):
|
|||||||
super().__init__(switch_state_callback, context)
|
super().__init__(switch_state_callback, context)
|
||||||
|
|
||||||
# Buttons
|
# 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.back_button.set_text("Back")
|
||||||
|
|
||||||
self.show_yaw_text = self.font.render("Show Yaw: ", True, (255, 255, 255))
|
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