ADD settings menu
This commit is contained in:
5
main.py
5
main.py
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
42
states/settings_menu.py
Normal 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)
|
||||||
|
|
||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user