diff --git a/controllers/player_controller.py b/controllers/player_controller.py new file mode 100644 index 0000000..87bf29f --- /dev/null +++ b/controllers/player_controller.py @@ -0,0 +1,27 @@ +from models.match import Match +from render.player_renderer import PlayerRenderer +import pygame + +class PlayerController: + def __init__(self, player_renderer: PlayerRenderer, match: Match): + self.player_renderer = player_renderer + self.match = match + + ## Private Methods + 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_controller.map_to_screen(player.x, player.y) + distance = ((mouse_x - player_x) ** 2 + (mouse_y - player_y) ** 2) ** 0.5 + + if distance < self.player_renderer.get_radius(): + player.is_hovered = True + else: + player.is_hovered = False + + ## Public Methods + def update(self, event): + for team in self.match.get_teams(): + for player in team.players: + self._update_hover_state(event, player) + \ No newline at end of file diff --git a/models/game.py b/models/game.py index df48033..2706fb0 100644 --- a/models/game.py +++ b/models/game.py @@ -3,6 +3,7 @@ from models.match import Match from models.player import Player from models.team import Team from render.renderer import Renderer +from controllers.player_controller import PlayerController WIDTH, HEIGHT = 700,700 FPS = 60 @@ -21,6 +22,7 @@ class Game: self.match = match self.renderer = Renderer(self.match, self.screen) + self.player_controller = PlayerController(self.renderer.player_render, self.match) def handle_events(self): """Handles user inputs.""" @@ -28,6 +30,7 @@ class Game: if event.type == pygame.QUIT: self.running = False self.renderer.slider.handle_event(event) + self.player_controller.update(event) def update(self): """Updates game objects.""" diff --git a/models/player.py b/models/player.py index 482a5b8..d42a3e4 100644 --- a/models/player.py +++ b/models/player.py @@ -12,4 +12,8 @@ class Player: self.dead = False self.is_shooting = False + ## UI-related state + self.is_selected = False + self.is_hovered = False + \ No newline at end of file diff --git a/render/player_renderer.py b/render/player_renderer.py index 9ba05b6..7b0611f 100644 --- a/render/player_renderer.py +++ b/render/player_renderer.py @@ -1,5 +1,6 @@ import pygame, math from models.match import Match +from models.player import Player from controllers.map_coord_controller import MapCoordController from utils.utils import mapped_value @@ -11,6 +12,7 @@ class PlayerRenderer: self.player_font = player_font self.player_radius = 5 + self.hovered_radius = 10 self.health_bar_foreground = (0, 255, 0) self.health_bar_background = (255, 0, 0) @@ -36,9 +38,14 @@ class PlayerRenderer: self.health_bar_background = colour ## Private Methods - def _render_circle(self, player, team): + def _render_circle(self, player: Player, team): + if player.is_hovered: + radius = self.hovered_radius + else: + radius = self.player_radius + x, y = self.map_coord_controller.map_to_screen(player.x, player.y) - pygame.draw.circle(self.screen, team.colour, (x, y), self.player_radius) + pygame.draw.circle(self.screen, team.colour, (x, y), radius) def _render_text(self, player): x, y = self.map_coord_controller.map_to_screen(player.x, player.y)