From bb06e3e338ded1a23a706d60090da4896ba71f51 Mon Sep 17 00:00:00 2001 From: ThisBirchWood Date: Sat, 3 May 2025 16:41:20 +0200 Subject: [PATCH] ADD breakpoints on slider for round changes --- .gitignore | 3 ++- models/match.py | 4 ++- render/control_renderer.py | 7 +++-- states/start_menu.py | 5 +++- widgets/break_slider.py | 55 ++++++++++++++++++++++++++++++++++++++ widgets/slider.py | 18 ++++++++++--- 6 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 widgets/break_slider.py diff --git a/.gitignore b/.gitignore index 760b0a3..932a86d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.dem __pycache__/ -venv \ No newline at end of file +venv +.venv \ No newline at end of file diff --git a/models/match.py b/models/match.py index fbf3cbc..3702a90 100644 --- a/models/match.py +++ b/models/match.py @@ -2,11 +2,13 @@ from models.player import Player from models.team import Team class Match: - def __init__(self, map_name, game_info, team_1: Team, team_2: Team, tick_rate=64): + def __init__(self, map_name, game_info, team_1: Team, team_2: Team, game_events, tick_rate=64): self.team_1 = team_1 self.team_2 = team_2 self.map_name = map_name + self.game_events = game_events + self.round_start_times = list(self.game_events[0][1]["tick"]) self.tick = 1 self.current_tick = game_info[game_info["tick"] == self.tick] diff --git a/render/control_renderer.py b/render/control_renderer.py index 4d68579..861b5cf 100644 --- a/render/control_renderer.py +++ b/render/control_renderer.py @@ -1,5 +1,5 @@ import pygame -from widgets.slider import HorizontalSlider +from widgets.break_slider import BreakSlider class ControlRenderer: def __init__(self, screen, match): @@ -8,7 +8,10 @@ class ControlRenderer: self.match = match self.colour = (255, 255, 255) - self.slider = HorizontalSlider(self.screen, 50, 0, self.screen.get_width()-50, 20, 1, self.match.max_tick) + self.slider = BreakSlider(self.screen, 50, 0, self.screen.get_width()-50, 20, 1, self.match.max_tick) + self.slider.fill = True + self.slider.set_breakpoints(self.match.round_start_times) + self.slider.set_fill_colour((0,0,0)) def _render_slider(self): # Update slider value diff --git a/states/start_menu.py b/states/start_menu.py index da0efbc..7aa1456 100644 --- a/states/start_menu.py +++ b/states/start_menu.py @@ -85,14 +85,17 @@ class StartMenu(GameState): "team_rounds_total", "team_num", "total_rounds_played", "shots_fired", "kills_total", "deaths_total", "assists_total", "inventory", "health", "armor_value", "active_weapon_name"]) + round_changes = demo_parser.parse_events(["round_start", "is_ct_timeout"]) header_info = demo_parser.parse_header() map_name = header_info['map_name'] players = demo_parser.parse_player_info() + print(demo_parser.list_game_events()) + team_1 = Team() team_2 = Team() team_2.set_ct() - m = Match(map_name, game_info, team_1, team_2, self.options) + m = Match(map_name, game_info, team_1, team_2, round_changes) for index, row in players.iterrows(): if row["team_number"] == 2: team_1.add_player(Player(row["name"], row["steamid"])) diff --git a/widgets/break_slider.py b/widgets/break_slider.py new file mode 100644 index 0000000..dfc3c1a --- /dev/null +++ b/widgets/break_slider.py @@ -0,0 +1,55 @@ +from widgets.slider import HorizontalSlider +import pygame + +class BreakSlider(HorizontalSlider): + def __init__(self, screen, x, y, width, height, min_value, max_value): + super().__init__(screen, x, y, width, height, min_value, max_value) + self.breakpoints = [] + + # defaults + self.breakpoint_colour = (0, 0, 0) + self.breakpoint_line_width = 2 + + def add_breakpoint(self, breakpoint): + if breakpoint < self.min_value or breakpoint > self.max_value: + raise ValueError("Breakpoint must fit between min and max values") + + self.breakpoints.append(breakpoint) + + def set_breakpoints(self, breakpoints): + self.breakpoints = breakpoints + + def _draw_breakpoints(self): + for breakpoint in self.breakpoints: + # create line + break_x = self._value_to_knob(breakpoint) + + pygame.draw.line(self.screen, + self.breakpoint_colour, + (break_x, self.y), + (break_x, self.y + self.height), + width=self.breakpoint_line_width) + + def draw(self): + self._draw_slider() + self._draw_breakpoints() + self._draw_knob() + +if __name__ == "__main__": + pygame.init() + screen = pygame.display.set_mode((800, 600)) + slider = BreakSlider(screen, 50, 50, 700, 20, 0, 1000) + slider.add_breakpoint(100) + slider.add_breakpoint(500) + slider.add_breakpoint(700) + running = True + + while running: + screen.fill((0, 0, 0)) + slider.draw() + pygame.display.flip() + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + slider.handle_event(event) diff --git a/widgets/slider.py b/widgets/slider.py index a36ed3c..4b8ca8f 100644 --- a/widgets/slider.py +++ b/widgets/slider.py @@ -54,17 +54,24 @@ class HorizontalSlider: self.knob_x = event.pos[0] self.value = self._knob_to_value(self.knob_x) - def draw(self): - """ - Draw the slider on the screen - """ + def _draw_slider(self): if self.fill: pygame.draw.rect(self.screen, self.fill_colour, (self.x, self.y, self.knob_x, self.height), border_radius=self.rect_radius) pygame.draw.rect(self.screen, self.background_colour, (self.knob_x, self.y, self.width - (self.knob_x - self.x), self.height), border_radius=self.rect_radius) else: pygame.draw.rect(self.screen, self.background_colour, (self.x, self.y, self.width, self.height), border_radius=self.rect_radius) + + def _draw_knob(self): pygame.draw.circle(self.screen, self.knob_colour, (int(self.knob_x), self.y + self.height // 2), self.knob_radius) + def draw(self): + """ + Draw the slider on the screen + """ + self._draw_slider() + self._draw_knob() + + def set_value(self, value): """ Set the value of the slider @@ -89,6 +96,9 @@ class HorizontalSlider: def set_knob_colour(self, colour): self.knob_colour = colour + def set_fill_colour(self, colour): + self.fill_colour = colour + if __name__ == "__main__": pygame.init() screen = pygame.display.set_mode((800, 600))