ADD settings menu

This commit is contained in:
2025-04-20 16:10:06 +02:00
parent 03b63fa9b6
commit ae4ab65081
7 changed files with 85 additions and 26 deletions

View File

@@ -1,6 +1,7 @@
import pygame 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
def main(): def main():
pygame.init() pygame.init()
@@ -17,6 +18,7 @@ def main():
"show_yaw": True "show_yaw": True
} }
} }
current_state = None current_state = None
def switch_state(state_name): def switch_state(state_name):
@@ -24,7 +26,7 @@ def main():
if state_name == "game": if state_name == "game":
# Initialize Game state here # Initialize Game state here
try: try:
match = context["match"] context["match"]
except KeyError: except KeyError:
raise ValueError("Match object is required to initialize Game state.") raise ValueError("Match object is required to initialize Game state.")
@@ -35,6 +37,7 @@ def main():
# Initialize states # Initialize states
states["start_menu"] = StartMenu(switch_state, context) states["start_menu"] = StartMenu(switch_state, context)
states["settings_menu"] = SettingsMenu(switch_state, context)
switch_state("start_menu") switch_state("start_menu")
running = True running = True

View File

@@ -5,11 +5,12 @@ from controllers.map_coord_controller import MapCoordController
from utils.utils import mapped_value from utils.utils import mapped_value
class PlayerRenderer: class PlayerRenderer:
def __init__(self, screen, match: Match, map_coord_controller: MapCoordController, player_font): def __init__(self, screen, match: Match, map_coord_controller: MapCoordController, options: dict):
self.screen = screen self.screen = screen
self.match = match self.match = match
self.map_coord_controller = map_coord_controller self.map_coord_controller = map_coord_controller
self.player_font = player_font self.options = options
self.player_font = pygame.font.Font(None, 15)
self.player_radius = 5 self.player_radius = 5
self.hovered_radius = 10 self.hovered_radius = 10
@@ -78,5 +79,6 @@ class PlayerRenderer:
self._render_circle(player, team) self._render_circle(player, team)
self._render_text(player) self._render_text(player)
self._render_yaw(player, team) if self.options["show_yaw"]:
self._render_yaw(player, team)
self._render_health(player) self._render_health(player)

View File

@@ -7,9 +7,10 @@ from render.gui_renderer import GUIRenderer
from utils.json_object import JSONObject from utils.json_object import JSONObject
class Renderer: class Renderer:
def __init__(self, match: Match, screen): def __init__(self, match: Match, screen, options: dict):
self.screen = screen self.screen = screen
self.match = match self.match = match
self.options = options
## Initialize fonts ## Initialize fonts
self.font = pygame.font.Font(None, 36) self.font = pygame.font.Font(None, 36)
@@ -42,7 +43,7 @@ class Renderer:
self.top_left_x, self.bottom_right_x, self.top_left_y, self.bottom_right_y) self.top_left_x, self.bottom_right_x, self.top_left_y, self.bottom_right_y)
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)
self.player_render = PlayerRenderer(self.screen, self.match, self.map_coord_controller, self.small_font) self.player_render = PlayerRenderer(self.screen, self.match, self.map_coord_controller, self.options)
self.text_render = GUIRenderer(self.screen, self.match) self.text_render = GUIRenderer(self.screen, self.match)
def render_map(self): def render_map(self):

View File

@@ -7,7 +7,7 @@ class Game(GameState):
def __init__(self, switch_state_callback, context): def __init__(self, switch_state_callback, context):
super().__init__(switch_state_callback, context) super().__init__(switch_state_callback, context)
self.renderer = Renderer(self.match, self.screen) self.renderer = Renderer(self.match, self.screen, self.options)
self.player_controller = PlayerController(self.renderer.player_render, self.match) self.player_controller = PlayerController(self.renderer.player_render, self.match)
def handle_events(self, events): def handle_events(self, events):
@@ -25,4 +25,3 @@ class Game(GameState):
def draw(self): def draw(self):
"""Draws everything on screen.""" """Draws everything on screen."""
self.renderer.render() self.renderer.render()
pygame.display.flip()

42
states/settings_menu.py Normal file
View File

@@ -0,0 +1,42 @@
from states.game_state import GameState
from widgets.button import Button
from widgets.switch import Switch
import pygame
class SettingsMenu(GameState):
def __init__(self, switch_state_callback, context):
super().__init__(switch_state_callback, context)
# Buttons
self.back_button = Button(10, 10, 50, 50, lambda: self.switch_state("start_menu"))
self.back_button.set_text("Back")
self.show_yaw_text = self.font.render("Show Yaw: ", True, (255, 255, 255))
self.show_yaw_button = Switch(100, 100, 50, 50, self.options["show_yaw"])
def handle_events(self, events):
"""Handles user inputs."""
for event in events:
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
self.switch_state("start_menu")
self.show_yaw_button.handle_event(event)
self.back_button.handle_event(event)
def update(self):
"""Updates settings based on user input."""
if self.show_yaw_button.get_is_toggled():
self.options["show_yaw"] = True
else:
self.options["show_yaw"] = False
# Save settings to context
self.context["options"] = self.options
def draw(self):
"""Renders the settings menu."""
self.screen.fill((30, 30, 30)) # Clear screen
self.screen.blit(self.show_yaw_text, (self.show_yaw_button.x + self.show_yaw_button.width + 10,
self.show_yaw_button.y))
self.show_yaw_button.draw(self.screen)
self.back_button.draw(self.screen)

View File

@@ -17,13 +17,21 @@ class StartMenu(GameState):
self.default_button_width = self.screen.get_width() * 0.8 self.default_button_width = self.screen.get_width() * 0.8
# buttons # buttons
self.button = Button(self.default_button_start_x, self.upload_demo_button = Button(self.default_button_start_x,
100, 100,
self.default_button_width, self.default_button_width,
50, 50,
self._get_demo) self._get_demo)
self.button.set_text("Upload Demo") self.upload_demo_button.set_text("Upload Demo")
self.button.set_font_size(40) self.upload_demo_button.set_font_size(40)
self.settings_button = Button(self.default_button_start_x,
200,
self.default_button_width,
50,
lambda: self.switch_state("settings_menu"))
self.settings_button.set_text("Settings")
self.settings_button.set_font_size(40)
# file dialog # file dialog
self.file_dialog = None self.file_dialog = None
@@ -57,7 +65,7 @@ class StartMenu(GameState):
team_1 = Team() team_1 = Team()
team_1.set_ct() team_1.set_ct()
team_2 = Team() team_2 = Team()
m = Match(map_name, game_info, team_1, team_2) m = Match(map_name, game_info, team_1, team_2, self.options)
for index, row in players.iterrows(): for index, row in players.iterrows():
if row["team_number"] == 2: if row["team_number"] == 2:
team_1.add_player(Player(row["name"], row["steamid"])) team_1.add_player(Player(row["name"], row["steamid"]))
@@ -72,7 +80,8 @@ class StartMenu(GameState):
for event in events: for event in events:
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
pygame.quit() pygame.quit()
self.button.handle_event(event) self.upload_demo_button.handle_event(event)
self.settings_button.handle_event(event)
self.manager.process_events(event) self.manager.process_events(event)
# Handle file dialog interaction # Handle file dialog interaction
if event.type == pygame_gui.UI_FILE_DIALOG_PATH_PICKED: if event.type == pygame_gui.UI_FILE_DIALOG_PATH_PICKED:
@@ -85,7 +94,9 @@ class StartMenu(GameState):
def draw(self): def draw(self):
"""Draws everything on screen.""" """Draws everything on screen."""
self.button.draw(self.screen) self.screen.fill((30, 30, 30)) # Clear screen
self.upload_demo_button.draw(self.screen)
self.settings_button.draw(self.screen)
self.manager.draw_ui(self.screen) self.manager.draw_ui(self.screen)

View File

@@ -70,22 +70,23 @@ class Switch:
self._press() self._press()
def draw(self, screen): def draw(self, screen):
# Draw the switch border # Move the rectangle to right over time if toggled
if self.is_toggled: if self.is_toggled and self.rect_offset < (self.width // 2):
self.rect_offset += self.toggle_speed
elif not self.is_toggled and self.rect_offset > 0:
# Move the rectangle to left over time if not toggled
self.rect_offset -= self.toggle_speed
elif self.is_toggled:
# Draw border
pygame.draw.rect(screen, (255, 0, 0), (self.x-self.border_width, pygame.draw.rect(screen, (255, 0, 0), (self.x-self.border_width,
self.y-self.border_width, self.y-self.border_width,
self.width+(self.border_width*2), self.width+(self.border_width*2),
self.height+(self.border_width*2)), self.height+(self.border_width*2)),
border_radius=self.border_radius) border_radius=self.border_radius)
# Draw the switch background # Draw the switch background
pygame.draw.rect(screen, self.background_colour, (self.x, self.y, self.width, self.height), border_radius=self.border_radius) pygame.draw.rect(screen, self.background_colour, (self.x, self.y, self.width, self.height), border_radius=self.border_radius)
# Draw the switch foreground # Draw the switch foreground
if self.is_toggled and self.rect_offset < (self.width // 2):
self.rect_offset += self.toggle_speed
elif not self.is_toggled and self.rect_offset > 0:
self.rect_offset -= self.toggle_speed
pygame.draw.rect(screen, self.foreground_colour, (self.x + self.rect_offset, self.y, self.width // 2, self.height), border_radius=self.border_radius) pygame.draw.rect(screen, self.foreground_colour, (self.x + self.rect_offset, self.y, self.width // 2, self.height), border_radius=self.border_radius)