diff --git a/controllers/control_controller.py b/controllers/control_controller.py new file mode 100644 index 0000000..1e920c3 --- /dev/null +++ b/controllers/control_controller.py @@ -0,0 +1,16 @@ +import pygame +import copy + +class ControlController: + def __init__(self, control_renderer, box_top: tuple[int, int]): + self.control_renderer = control_renderer + self.box_top = box_top + + self.slider = control_renderer.slider + + def update(self, event): + new_event = pygame.event.Event(event.type, event.__dict__) + if hasattr(new_event, 'pos'): + new_event.pos = (event.pos[0] - self.box_top[0], event.pos[1] - self.box_top[1]) + + self.slider.handle_event(new_event) \ No newline at end of file diff --git a/controllers/gui_controller.py b/controllers/gui_controller.py index 839d57d..fab0e48 100644 --- a/controllers/gui_controller.py +++ b/controllers/gui_controller.py @@ -1,11 +1,10 @@ from render.gui_renderer import GUIRenderer class GUIController: - def __init__(self, gui_renderer: GUIRenderer, callback_function, previous_states): + def __init__(self, gui_renderer: GUIRenderer, callback_function): self.callback_function = callback_function self.gui_renderer = gui_renderer - self.slider = gui_renderer.slider self.settings_button = gui_renderer.settings_button self.settings_button.set_action(lambda: self.callback_function("settings_menu")) @@ -13,6 +12,5 @@ class GUIController: self.back_button.set_action(lambda: self.callback_function("start_menu")) def update(self, event): - self.slider.handle_event(event) self.settings_button.handle_event(event) self.back_button.handle_event(event) \ No newline at end of file diff --git a/main.py b/main.py index a979a91..b2921a5 100644 --- a/main.py +++ b/main.py @@ -26,7 +26,8 @@ def main(): "button_colour": (200, 200, 200), "pressed_button_colour": (150, 150, 150), "text_colour": (255, 255, 255), - "background_colour": (30, 30, 30) + "background_colour": (30, 30, 30), + "foreground_colour": (100, 100, 100) } } diff --git a/render/control_renderer.py b/render/control_renderer.py new file mode 100644 index 0000000..4d68579 --- /dev/null +++ b/render/control_renderer.py @@ -0,0 +1,24 @@ +import pygame +from widgets.slider import HorizontalSlider + +class ControlRenderer: + def __init__(self, screen, match): + self.screen = screen + self.font = pygame.font.Font(None, 36) + 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) + + def _render_slider(self): + # Update slider value + if self.slider.dragging: + # Set match tick if slider is being dragged + self.match.set_tick(int(self.slider.value)) + else: + # Set slider value if slider is not being dragged + self.slider.set_value(self.match.tick) + self.slider.draw() + + def render(self): + self._render_slider() \ No newline at end of file diff --git a/render/gui_renderer.py b/render/gui_renderer.py index 065dcfe..988daf4 100644 --- a/render/gui_renderer.py +++ b/render/gui_renderer.py @@ -1,5 +1,4 @@ import pygame -from widgets.slider import HorizontalSlider from widgets.button import Button class GUIRenderer: @@ -8,8 +7,7 @@ class GUIRenderer: self.font = pygame.font.Font(None, 36) self.match = match - self.slider = HorizontalSlider(self.screen, 50, 650, self.screen.get_width()-100, 20, 1, self.match.max_tick) - + # Buttons self.settings_button = Button(self.screen.get_width()-40, 10, 30, 30, None) self.settings_button.set_image("assets/setting.png") @@ -23,16 +21,6 @@ class GUIRenderer: self.settings_button.draw(self.screen) self.back_button.draw(self.screen) - def _render_slider(self): - # Update slider value - if self.slider.dragging: - # Set match tick if slider is being dragged - self.match.set_tick(int(self.slider.value)) - else: - # Set slider value if slider is not being dragged - self.slider.set_value(self.match.tick) - self.slider.draw() def render(self): self._render_buttons() - self._render_slider() diff --git a/render/info_renderer.py b/render/info_renderer.py index 581f7b5..f68f45a 100644 --- a/render/info_renderer.py +++ b/render/info_renderer.py @@ -17,14 +17,17 @@ class InfoRenderer: 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_title = f"{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" player_info += f"Armour: {self.selected_player.armour}\n" - text_surface = self.small_font.render(player_info, True, self.styling["text_colour"]) + text_surface = self.font.render(player_info_title, True, self.styling["text_colour"]) self.screen.blit(text_surface, (10, 100)) + text_surface = self.small_font.render(player_info, True, self.styling["text_colour"]) + self.screen.blit(text_surface, (10, 150)) + def _render_current_tick(self, match_tick, max_tick): text = self.font.render(f"Tick: {match_tick}/{max_tick}", True, self.colour) self.screen.blit(text, (10, 10)) diff --git a/states/game.py b/states/game.py index 87e62e9..81a0714 100644 --- a/states/game.py +++ b/states/game.py @@ -4,9 +4,11 @@ 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 render.control_renderer import ControlRenderer from utils.map_coord_converter import MapCoordConverter from controllers.gui_controller import GUIController from controllers.info_controller import InfoController +from controllers.control_controller import ControlController import pygame class Game(GameState): @@ -17,12 +19,15 @@ class Game(GameState): match_image_path = f"maps/{self.match.map_name}.png" # Screen Areas - self.gui_box = pygame.Surface((350, self.screen.get_height()), pygame.SRCALPHA) - self.gui_box_top_left = (0, 0) + self.info_box = pygame.Surface((350, self.screen.get_height()), pygame.SRCALPHA) + self.info_box_top_left = (0, 0) - self.game_box = pygame.Surface((600, 600), pygame.SRCALPHA) + self.game_box = pygame.Surface((650, 650), pygame.SRCALPHA) self.game_box_top_left = (350, 0) + self.control_box = pygame.Surface((650, 120), pygame.SRCALPHA) + self.control_box_top_left = (350, 650) + # Helper Classes self.map_coord_controller = MapCoordConverter(self.game_box.get_width(), self.game_box.get_height(), match_data_path, match_image_path) @@ -30,12 +35,14 @@ 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, self.match) + self.info_render = InfoRenderer(self.info_box, self.styling, self.match) + self.control_render = ControlRenderer(self.control_box, self.match) # 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.gui_controller = GUIController(self.gui_render, self.switch_state) self.info_controller = InfoController(self.info_render, self.player_controller) + self.control_controller = ControlController(self.control_render, self.control_box_top_left) def handle_events(self, events): """Handles user inputs.""" @@ -45,6 +52,7 @@ class Game(GameState): self.player_controller.update(event) self.gui_controller.update(event) self.info_controller.update(event) + self.control_controller.update(event) def update(self): """Updates game objects.""" @@ -54,9 +62,14 @@ class Game(GameState): """Draws everything on screen.""" self.screen.fill(self.styling["background_colour"]) self.game_box.fill(self.styling["background_colour"]) + self.info_box.fill(self.styling["foreground_colour"]) + self.control_box.fill(self.styling["background_colour"]) self.map_renderer.render() self.player_renderer.render() self.gui_render.render() self.info_render.render() + self.control_render.render() + self.screen.blit(self.info_box, self.info_box_top_left) + self.screen.blit(self.control_box, self.control_box_top_left) self.screen.blit(self.game_box, self.game_box_top_left) \ No newline at end of file