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