diff --git a/main.py b/main.py index 0ca2ff3..44af99e 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ import pygame from states.game import Game from states.start_menu import StartMenu +from states.settings_menu import SettingsMenu def main(): pygame.init() @@ -17,6 +18,7 @@ def main(): "show_yaw": True } } + current_state = None def switch_state(state_name): @@ -24,7 +26,7 @@ def main(): if state_name == "game": # Initialize Game state here try: - match = context["match"] + context["match"] except KeyError: raise ValueError("Match object is required to initialize Game state.") @@ -35,6 +37,7 @@ def main(): # Initialize states states["start_menu"] = StartMenu(switch_state, context) + states["settings_menu"] = SettingsMenu(switch_state, context) switch_state("start_menu") running = True diff --git a/render/player_renderer.py b/render/player_renderer.py index 7b0611f..c2ad3f8 100644 --- a/render/player_renderer.py +++ b/render/player_renderer.py @@ -5,11 +5,12 @@ from controllers.map_coord_controller import MapCoordController from utils.utils import mapped_value 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.match = match 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.hovered_radius = 10 @@ -78,5 +79,6 @@ class PlayerRenderer: self._render_circle(player, team) self._render_text(player) - self._render_yaw(player, team) + if self.options["show_yaw"]: + self._render_yaw(player, team) self._render_health(player) \ No newline at end of file diff --git a/render/renderer.py b/render/renderer.py index f8f7dff..36553fa 100644 --- a/render/renderer.py +++ b/render/renderer.py @@ -7,9 +7,10 @@ from render.gui_renderer import GUIRenderer from utils.json_object import JSONObject class Renderer: - def __init__(self, match: Match, screen): + def __init__(self, match: Match, screen, options: dict): self.screen = screen self.match = match + self.options = options ## Initialize fonts 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.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) def render_map(self): diff --git a/states/game.py b/states/game.py index 294e6f7..53307b2 100644 --- a/states/game.py +++ b/states/game.py @@ -7,7 +7,7 @@ class Game(GameState): def __init__(self, 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) def handle_events(self, events): @@ -24,5 +24,4 @@ class Game(GameState): def draw(self): """Draws everything on screen.""" - self.renderer.render() - pygame.display.flip() \ No newline at end of file + self.renderer.render() \ No newline at end of file diff --git a/states/settings_menu.py b/states/settings_menu.py new file mode 100644 index 0000000..e1fcb96 --- /dev/null +++ b/states/settings_menu.py @@ -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) + diff --git a/states/start_menu.py b/states/start_menu.py index 0981fd5..316aa00 100644 --- a/states/start_menu.py +++ b/states/start_menu.py @@ -17,13 +17,21 @@ class StartMenu(GameState): self.default_button_width = self.screen.get_width() * 0.8 # buttons - self.button = Button(self.default_button_start_x, + self.upload_demo_button = Button(self.default_button_start_x, 100, self.default_button_width, 50, self._get_demo) - self.button.set_text("Upload Demo") - self.button.set_font_size(40) + self.upload_demo_button.set_text("Upload Demo") + 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 self.file_dialog = None @@ -57,7 +65,7 @@ class StartMenu(GameState): team_1 = Team() team_1.set_ct() 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(): if row["team_number"] == 2: team_1.add_player(Player(row["name"], row["steamid"])) @@ -72,7 +80,8 @@ class StartMenu(GameState): for event in events: if event.type == 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) # Handle file dialog interaction if event.type == pygame_gui.UI_FILE_DIALOG_PATH_PICKED: @@ -85,7 +94,9 @@ class StartMenu(GameState): def draw(self): """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) diff --git a/widgets/switch.py b/widgets/switch.py index ac07ae9..7bf1a46 100644 --- a/widgets/switch.py +++ b/widgets/switch.py @@ -70,22 +70,23 @@ class Switch: self._press() def draw(self, screen): - # Draw the switch border - if self.is_toggled: + # Move the rectangle to right over time if 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, - self.y-self.border_width, - self.width+(self.border_width*2), - self.height+(self.border_width*2)), - border_radius=self.border_radius) + self.y-self.border_width, + self.width+(self.border_width*2), + self.height+(self.border_width*2)), + border_radius=self.border_radius) # Draw the switch background pygame.draw.rect(screen, self.background_colour, (self.x, self.y, self.width, self.height), border_radius=self.border_radius) # 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)