diff --git a/controllers/info_controller.py b/controllers/info_controller.py new file mode 100644 index 0000000..8388249 --- /dev/null +++ b/controllers/info_controller.py @@ -0,0 +1,8 @@ +class InfoController: + def __init__(self, info_renderer, player_controller): + self.info_renderer = info_renderer + self.player_controller = player_controller + + def update(self, event): + self.info_renderer.selected_player = self.player_controller.selected_player + diff --git a/controllers/player_controller.py b/controllers/player_controller.py index 0fa4eec..f9ea206 100644 --- a/controllers/player_controller.py +++ b/controllers/player_controller.py @@ -8,22 +8,33 @@ class PlayerController: self.match = match self.game_box_top = game_box_top + self.selected_player = None + ## Private Methods + def _is_player_at_mouse(self, player, mouse_x, mouse_y): + player_x, player_y = self.player_renderer.map_coord_converter.map_to_screen(player.x, player.y) + + # Adjust for game box position + player_x += self.game_box_top[0] + player_y += self.game_box_top[1] + + distance = ((mouse_x - player_x) ** 2 + (mouse_y - player_y) ** 2) ** 0.5 + + return distance < self.player_renderer.get_radius() + def _update_hover_state(self, event, player): if event.type == pygame.MOUSEMOTION: mouse_x, mouse_y = event.pos - player_x, player_y = self.player_renderer.map_coord_converter.map_to_screen(player.x, player.y) - - # Adjust for game box position - player_x += self.game_box_top[0] - player_y += self.game_box_top[1] - - distance = ((mouse_x - player_x) ** 2 + (mouse_y - player_y) ** 2) ** 0.5 - - if distance < self.player_renderer.get_radius(): + if self._is_player_at_mouse(player, mouse_x, mouse_y): player.is_hovered = True else: player.is_hovered = False + elif event.type == pygame.MOUSEBUTTONDOWN: + mouse_x, mouse_y = event.pos + if self._is_player_at_mouse(player, mouse_x, mouse_y): + player.is_selected = not player.is_selected + self.selected_player = player if player.is_selected else None + print(f"Selected player: {player.name}" if player.is_selected else "Player deselected") ## Public Methods def update(self, event): diff --git a/main.py b/main.py index 7c73bdc..71c3949 100644 --- a/main.py +++ b/main.py @@ -69,7 +69,7 @@ def main(): current_state.draw() pygame.display.flip() - clock.tick(60) + clock.tick(144) pygame.quit() diff --git a/models/match.py b/models/match.py index 785294d..d8dc4fc 100644 --- a/models/match.py +++ b/models/match.py @@ -37,6 +37,7 @@ class Match: player.dead = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["is_alive"].values[0] == 0 player.is_shooting = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["shots_fired"].values[0] player.health = int(self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["health"].values[0]) + player.current_weapon = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["active_weapon_name"].values[0] def _update_round(self) -> None: if self.current_tick.empty: diff --git a/models/player.py b/models/player.py index d42a3e4..b177464 100644 --- a/models/player.py +++ b/models/player.py @@ -11,6 +11,7 @@ class Player: self.health = 100 self.dead = False self.is_shooting = False + self.current_weapon = None ## UI-related state self.is_selected = False diff --git a/render/info_renderer.py b/render/info_renderer.py new file mode 100644 index 0000000..a3ee691 --- /dev/null +++ b/render/info_renderer.py @@ -0,0 +1,27 @@ +import pygame + +class InfoRenderer: + def __init__(self, screen, styling): + self.screen = screen + self.styling = styling + self.font = self.styling["small_font"] + + self.selected_player = None + + # Private methods + def _draw_player_info(self): + """Draws the player info on the screen.""" + if self.selected_player is None: + return + + player_info = f"Player: {self.selected_player.name}\n" + player_info += f"Active Weapon: {self.selected_player.current_weapon}\n" + player_info += f"Health: {self.selected_player.health}\n" + + text_surface = self.font.render(player_info, True, self.styling["text_colour"]) + self.screen.blit(text_surface, (10, 100)) + + # Public methods + def render(self): + """Renders the info on the screen.""" + self._draw_player_info() \ No newline at end of file diff --git a/states/game.py b/states/game.py index 1abc985..36425fd 100644 --- a/states/game.py +++ b/states/game.py @@ -3,8 +3,10 @@ from controllers.player_controller import PlayerController from render.map_renderer import MapRenderer from render.gui_renderer import GUIRenderer from render.player_renderer import PlayerRenderer +from render.info_renderer import InfoRenderer from utils.map_coord_converter import MapCoordConverter from controllers.gui_controller import GUIController +from controllers.info_controller import InfoController import pygame class Game(GameState): @@ -14,7 +16,7 @@ class Game(GameState): match_data_path = f"maps/{self.match.map_name}.json" match_image_path = f"maps/{self.match.map_name}.png" - # Game Box + # Screen Areas self.game_box = pygame.Surface((600, 600), pygame.SRCALPHA) self.game_box_top_left = (350, 0) @@ -25,11 +27,12 @@ class Game(GameState): self.map_renderer = MapRenderer(self.game_box, match_data_path, match_image_path) self.player_renderer = PlayerRenderer(self.game_box, self.match, self.map_coord_controller, self.options) self.gui_render = GUIRenderer(self.screen, self.match) + self.info_render = InfoRenderer(self.screen, self.styling) # Controllers self.player_controller = PlayerController(self.player_renderer, self.match, self.game_box_top_left) self.gui_controller = GUIController(self.gui_render, self.switch_state, self.context["previous_states"]) - + self.info_controller = InfoController(self.info_render, self.player_controller) def handle_events(self, events): """Handles user inputs.""" @@ -38,6 +41,7 @@ class Game(GameState): self.switch_state("menu") self.player_controller.update(event) self.gui_controller.update(event) + self.info_controller.update(event) def update(self): """Updates game objects.""" @@ -51,4 +55,5 @@ class Game(GameState): self.map_renderer.render() self.player_renderer.render() self.gui_render.render() + self.info_render.render() self.screen.blit(self.game_box, self.game_box_top_left) \ No newline at end of file diff --git a/states/start_menu.py b/states/start_menu.py index bde504d..8e9145a 100644 --- a/states/start_menu.py +++ b/states/start_menu.py @@ -75,7 +75,7 @@ class StartMenu(GameState): demo_parser = demoparser2.DemoParser(demo_file) game_info = demo_parser.parse_ticks(["X", "Y", "Z", "pitch", "yaw", "is_alive", "team", "player_steamid", "team_rounds_total", "team_num", "total_rounds_played", "shots_fired", - "health"]) + "health", "active_weapon_name"]) header_info = demo_parser.parse_header() map_name = header_info['map_name'] players = demo_parser.parse_player_info()