From c55abfe02ea816c6cdca0b1e5dbb6a30c103d3c0 Mon Sep 17 00:00:00 2001 From: ThisBirchWood Date: Sun, 16 Mar 2025 17:09:59 +0100 Subject: [PATCH] UPDATE: New rendering method, using real CS2 data, less guessing, more accuracy. REMOVE: Image coord controller --- controllers/image_coord_controller.py | 61 --------------------------- maps/de_mirage.json | 28 +++++++++--- models/game.py | 2 +- models/match.py | 4 +- models/renderer.py | 38 +++++++---------- 5 files changed, 40 insertions(+), 93 deletions(-) delete mode 100644 controllers/image_coord_controller.py diff --git a/controllers/image_coord_controller.py b/controllers/image_coord_controller.py deleted file mode 100644 index 3cb06e2..0000000 --- a/controllers/image_coord_controller.py +++ /dev/null @@ -1,61 +0,0 @@ -from utils.utils import mapped_value -import math - -class ImageCoordController: - def __init__(self, image_width, image_height, screen_width, screen_height, ingame_zero_x, ingame_zero_y): - self.image_width = image_width - self.image_height = image_height - self.ingame_zero_x = ingame_zero_x - self.ingame_zero_y = ingame_zero_y - - self.screen_width = screen_width - self.screen_height = screen_height - - self.screen_middle_x = screen_width / 2 - self.screen_middle_y = screen_height / 2 - - self.scaler = 1.0 - self.rotation_degrees = 0 - - def scale(self, scaler): - self.scaler = scaler - - def rotate(self, degree): - ## validate for multiples of 90 degrees and convert to 0-360 - if degree % 90 != 0: - raise ValueError("Degree v must be a multiple of 90") - self.rotation_degrees = degree % 360 - - def top_left_screen(self): - if self.rotation_degrees == 0: - x = self.screen_middle_x - (self.ingame_zero_x * self.scaler) - y = self.screen_middle_y - (self.ingame_zero_y * self.scaler) - elif self.rotation_degrees == 270: - x = self.screen_middle_x - ((self.image_width - self.ingame_zero_y) * self.scaler) - y = self.screen_middle_y - (self.ingame_zero_x * self.scaler) - elif self.rotation_degrees == 180: - x = self.screen_middle_x - ((self.image_width - self.ingame_zero_x) * self.scaler) - y = self.screen_middle_y - ((self.image_height - self.ingame_zero_y) * self.scaler) - elif self.rotation_degrees == 90: - x = self.screen_middle_x - (self.ingame_zero_y * self.scaler) - y = self.screen_middle_y - ((self.image_height - self.ingame_zero_x) * self.scaler) - return x, y - - - - - - -''' -ingame zero maps to 0,0,0 in game, and needs to map to middle of pygame window - -''' -if __name__ == "__main__": - image_coord_controller = ImageCoordController(1024, 1024, 640, 360) - image_coord_controller.scale(4) - print(image_coord_controller.image_to_screen(0,0)) - - - - - diff --git a/maps/de_mirage.json b/maps/de_mirage.json index 488487e..20e6914 100644 --- a/maps/de_mirage.json +++ b/maps/de_mirage.json @@ -1,9 +1,23 @@ { - "middle_x": 650, - "middle_y": 340, - "scale": 0.6, - "rotation": 270, - "image_path": "maps/de_mirage.png", - "image_width": 1024, - "image_height": 1024 + "material": "maps/de_mirage.png", + "pos_x": -3230, + "pos_y": 1713, + "scale": 5.00, + "rotate": 0, + "zoom": 0, + + "CTSpawn_x": "0.28", + "CTSpawn_y": "0.70", + "TSpawn_x": "0.87", + "TSpawn_y": "0.36", + + "bombA_x": "0.54", + "bombA_y": "0.76", + "bombB_x": "0.23", + "bombB_y": "0.28", + + "inset_left": "0.135", + "inset_top": "0.08", + "inset_right": "0.105", + "inset_bottom": "0.08" } \ No newline at end of file diff --git a/models/game.py b/models/game.py index 36985a7..b7b05eb 100644 --- a/models/game.py +++ b/models/game.py @@ -4,7 +4,7 @@ from models.player import Player from models.team import Team from models.renderer import Renderer -WIDTH, HEIGHT = 700, 700 +WIDTH, HEIGHT = 700,700 FPS = 60 class Game: diff --git a/models/match.py b/models/match.py index 4769cb7..3da2961 100644 --- a/models/match.py +++ b/models/match.py @@ -25,8 +25,8 @@ class Match: return for player in self.get_players(): - player.x = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["Y"].values[0] - player.y = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["X"].values[0] + player.x = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["X"].values[0] + player.y = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["Y"].values[0] player.z = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["Z"].values[0] player.pitch = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["pitch"].values[0] player.yaw = self.current_tick[self.current_tick["player_steamid"] == player.steam_id]["yaw"].values[0] diff --git a/models/renderer.py b/models/renderer.py index 89a3658..fc9a2fc 100644 --- a/models/renderer.py +++ b/models/renderer.py @@ -5,7 +5,6 @@ from models.match import Match from models.player import Player from models.team import Team from controllers.map_coord_controller import MapCoordController -from controllers.image_coord_controller import ImageCoordController from utils.json_object import JSONObject class Renderer: @@ -20,23 +19,22 @@ class Renderer: except FileNotFoundError: raise NotImplementedError(f"Map {match.map_name} not implemented.") - self.image_path = self.json_object.get("image_path") - self.image_path = self.json_object.get("image_path") - self.image_width = self.json_object.get("image_width") - self.image_height = self.json_object.get("image_height") - self.ingame_zero_x = self.json_object.get("middle_x") - self.ingame_zero_y = self.json_object.get("middle_y") - self.rotation_degrees = self.json_object.get("rotation") - self.scaler = self.json_object.get("scale") + self.top_left_x = self.json_object.get("pos_x") + self.top_left_y = self.json_object.get("pos_y") + self.scale = self.json_object.get("scale") + self.rotation = self.json_object.get("rotate") + self.image_path = self.json_object.get("material") + + self.map_image = pygame.image.load(self.image_path) + self.image_width = self.map_image.get_width() + self.image_height = self.map_image.get_height() + + self.bottom_right_x = self.top_left_x + (self.image_width * self.scale) + self.bottom_right_y = self.top_left_y - (self.image_height * self.scale) + self.map_coord_controller = MapCoordController(self.screen.get_width(), self.screen.get_height(), - -3000, 3000, -3000, 3000) - self.image_coord_controller = ImageCoordController(self.image_width, self.image_height, - self.screen.get_width(), self.screen.get_height(), - self.ingame_zero_x, self.ingame_zero_y) - self.image_coord_controller.scale(self.scaler) - self.image_coord_controller.rotate(self.rotation_degrees) - + self.top_left_x, self.bottom_right_x, self.top_left_y, self.bottom_right_y) def render_players(self): """Draws everything on screen.""" for player in self.match.get_players(): @@ -61,15 +59,11 @@ class Renderer: self.screen.blit(text, (10, 40)) def render_map(self): - # Draw map from image - map_image = pygame.image.load(self.image_path) - # Scale and rotate map image - map_image = pygame.transform.scale(map_image, (self.image_width*self.scaler, self.image_height*self.scaler)) - map_image = pygame.transform.rotate(map_image, self.rotation_degrees) + self.map_image = pygame.transform.scale(self.map_image, (self.screen.get_width(), self.screen.get_height())) # Draw map image - self.screen.blit(map_image, self.image_coord_controller.top_left_screen()) + self.screen.blit(self.map_image, (0, 0)) ''' def render_slider(self):