From 1dcca74af75993c02881c2445f5be81f4a3cd421 Mon Sep 17 00:00:00 2001 From: Leon Grothus <leon.grothus@gmail.com> Date: Sun, 4 Feb 2024 18:20:54 +0100 Subject: [PATCH] added spring texture --- assets/images/objects/spring.png | Bin 0 -> 5416 bytes data/constants.py | 2 +- data/data.png | Bin 92 -> 286 bytes data/options.json | 2 +- source/api/components/textur_renderer.py | 111 +++++++++++++++++++++++ source/game/objects/spring.py | 5 +- source/game/scenes/main_pinball.py | 12 +-- 7 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 assets/images/objects/spring.png create mode 100644 source/api/components/textur_renderer.py diff --git a/assets/images/objects/spring.png b/assets/images/objects/spring.png new file mode 100644 index 0000000000000000000000000000000000000000..68293d2ff1ffbf695d0d8a8ea3084082252e5ce1 GIT binary patch literal 5416 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 MYlUaw7h%bN0ixtlh5!Hn literal 0 HcmV?d00001 diff --git a/data/constants.py b/data/constants.py index 583a86e..492fb0a 100644 --- a/data/constants.py +++ b/data/constants.py @@ -15,7 +15,7 @@ PADDLE_COLLISION_DAMPING = .66 # Factor to scale the velocity with when the padd FRAMERATE = 60 # Frames per second -PTPF = 8 # Physics ticks per frame +PTPF = 10 # Physics ticks per frame DELTA_TIME = (1 / FRAMERATE) # Delta time for updates PROJECT_PATH: Path = Path(__file__).parents[1] # Path to the project directory diff --git a/data/data.png b/data/data.png index af087751117087b6c797315bb33c3d10aa53c351..1fd415f9451e7d5dbe6868ea6da0a6d8f47fefa2 100644 GIT binary patch literal 286 zcmV+(0pb3MP)<h;3K|Lk000e1NJLTq003zK003zL000005&1Be0002xNkl<Zc$}?N zF^&Tv5HoNRCHDhfa*OgWq#*4*jLl29A51zTZE%XDNm6l>>87ydu{;Kn0Dd4xB!R`# zOs!xIY#ne7%Ov)VY7>AJ8GRP}O4Sofgb_!*stVUw;o3CzmC6qQ9ARyK=&0=3hLsl! z04J?i3mki5iCR^FksPsv9a`Hhe!lU?dS2T<u+KwsM@J~2`oJVPc0;mjbL9sdJ>}S@ zv2RqA48O@eVagxm9`9aNtyfDZ(Ni4Nsyw+r`bwLtzL|o4`oKGXT@Jkd0>K#4YWqrZ kL=yLrTpj5vT+_Db4bNwCn!@!QlK=n!07*qoM6N<$f}lQjTmS$7 literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^k|4|oBpBXI+Hnp@DSNs&hE&W+PT27Oz=0zN4m9`~ p{Q2Lm*fu}mM`FA4qyLO=gcuGlVe^sxD6a|9=IQF^vd$@?2>{3*9?Sp$ diff --git a/data/options.json b/data/options.json index 3c9ca10..86a52f5 100644 --- a/data/options.json +++ b/data/options.json @@ -1 +1 @@ -{"asf": 1.0, "master_volume": 50, "music_volume": 50, "sfx_volume": 50, "user_name": "Player"} \ No newline at end of file +{"asf": 1.5, "master_volume": 50, "music_volume": 50, "sfx_volume": 50, "user_name": "Player"} \ No newline at end of file diff --git a/source/api/components/textur_renderer.py b/source/api/components/textur_renderer.py new file mode 100644 index 0000000..8919a0d --- /dev/null +++ b/source/api/components/textur_renderer.py @@ -0,0 +1,111 @@ +from pathlib import Path +import pygame +from source.api.components.component import Component + +from source.api.components.mesh import CircleMesh, Mesh, PolygonMesh + +class TexturRenderer(Component): + """ + The Renderer class is responsible for rendering the visual representation of an entity in the game scene. + + Attributes: + visible (bool): Whether the renderer is visible or not. + mesh (Mesh): The mesh component of the parent entity. + mesh_type (type): The type of the mesh component of the parent entity. + + Methods: + __init__(self, visible: bool = True) + on_init(self) + on_late_update(self, delta_time: float) + get_mesh(self) + serialize(self) -> dict + deserialize(self, data: dict) -> 'Renderer' + """ + + def __init__(self, textur_path: Path, width: float, height: float, visible: bool = True, alpha: int = 200) -> None: + """ + Initializes the renderer component. + + Arguments: + visible (bool, optional): Whether the renderer is visible or not. Defaults to True. + """ + + super().__init__() + + self.width = width + self.height = height + self.textur_path = textur_path + self.texture = pygame.image.load(textur_path).convert_alpha() + self.texture = pygame.transform.scale(self.texture, (int(width), int(height))) + self.texture.set_alpha(alpha) + self.visible: bool = visible + self.screen = pygame.display.get_surface() + + def on_init(self) -> None: + """ + Called when the renderer component is initialized. + + Returns: + None + """ + self.rotate(self.parent.transform.rot.get_value()) + self.parent.transform.rot.subscribe(self.rotate) + return super().on_init() + + def on_late_update(self, delta_time: float) -> None: + """ + Called when the renderer component is updated. + + Arguments: + delta_time (float): The time since the last frame. + + Returns: + None + """ + self.screen.blit(self.rotated_texture, self.rotated_rect.topleft) + return super().on_update(delta_time) + + + def rotate(self, angle: float) -> None: + """ + Rotates the renderer component by the given angle. + + Arguments: + angle (float): The angle to rotate the renderer by. + + Returns: + None + """ + self.rotated_texture = pygame.transform.rotate(self.texture, -angle) + self.rotated_rect = self.rotated_texture.get_rect(center = self.texture.get_rect(center = (self.parent.transform.pos.x, self.parent.transform.pos.y)).center) + + def serialize(self) -> dict: + """ + Serializes the renderer component data into a dictionary. + + Returns: + dict: The serialized renderer data. + """ + return { + "textur_path": self.textur_path, + "width": self.width, + "height": self.height, + "visible": self.visible + } + + def deserialize(self, data: dict) -> 'TexturRenderer': + """ + Deserializes the renderer component data from a dictionary. + + Arguments: + data (dict): The serialized renderer data. + + Returns: + Renderer: The deserialized renderer component. + """ + self.textur_path = data["textur_path"] + self.width = data["width"] + self.height = data["height"] + self.visible = data["visible"] + self.texture = pygame.image.load(self.textur_path).convert_alpha() + return self \ No newline at end of file diff --git a/source/game/objects/spring.py b/source/game/objects/spring.py index c50eb83..3b4b7e9 100644 --- a/source/game/objects/spring.py +++ b/source/game/objects/spring.py @@ -5,6 +5,7 @@ from source.api.components.change_score import ChangeScore from source.api.components.collider import PolygonCollider from source.api.components.mesh import PolygonMesh from source.api.components.renderer import Renderer +from source.api.components.textur_renderer import TexturRenderer from source.api.management.options_manager import OptionsManager from source.api.objects.game_object import GameObject from data.constants import ASSETS_PATH @@ -40,6 +41,8 @@ class Spring(GameObject): super().__init__(pos, 0, scene) self.spring_sound: pygame.mixer.Sound = pygame.mixer.Sound(ASSETS_PATH / Path("sounds/spring.wav")) + textur_path = ASSETS_PATH / Path("images/objects/spring.png") + rel_points = [ Vector2(-width/2, -height/2), Vector2(width/2, -height/2), @@ -50,7 +53,7 @@ class Spring(GameObject): self.add_components( PolygonMesh(color, rel_points), PolygonCollider(is_trigger=True), - Renderer(), + TexturRenderer(textur_path, width, height), self.change_score ) diff --git a/source/game/scenes/main_pinball.py b/source/game/scenes/main_pinball.py index 0e83b52..cf2ced6 100644 --- a/source/game/scenes/main_pinball.py +++ b/source/game/scenes/main_pinball.py @@ -221,20 +221,20 @@ class MainPinball(Scene): # springs # left - self.add_gameobject(Spring(self, V2(23, 700)*asf, width=12*asf, height=50 * + self.add_gameobject(Spring(self, V2(23, 700)*asf, width=10*asf, height=50 * asf, color=Color(150, 150, 150), add_to_score=25)) - self.add_gameobject(Spring(self, V2(70, 650)*asf, width=12*asf, height=50 * + self.add_gameobject(Spring(self, V2(70, 650)*asf, width=10*asf, height=50 * asf, color=Color(150, 150, 150), add_to_score=25)) # right - self.add_gameobject(Spring(self, V2(580, 700)*asf, width=12*asf, height=50 * + self.add_gameobject(Spring(self, V2(580, 700)*asf, width=10*asf, height=50 * asf, color=Color(150, 150, 150), add_to_score=25)) - self.add_gameobject(Spring(self, V2(532, 650)*asf, width=12*asf, height=50 * + self.add_gameobject(Spring(self, V2(532, 650)*asf, width=10*asf, height=50 * asf, color=Color(150, 150, 150), add_to_score=25)) # center - self.add_gameobject(Spring(self, V2(300, 800)*asf, width=12*asf, height=50 * + self.add_gameobject(Spring(self, V2(300, 800)*asf, width=10*asf, height=50 * asf, color=Color(150, 150, 150), add_to_score=25)) # tube - self.add_gameobject(Spring(self, V2(70, 493)*asf, width=12*asf, height=50*asf, + self.add_gameobject(Spring(self, V2(70, 493)*asf, width=10*asf, height=50*asf, color=Color(150, 150, 150), add_to_score=25, rotation=-35)) # target -- GitLab