From 7e7751fc5d76650890a0176ad41c5df8c0f31e75 Mon Sep 17 00:00:00 2001 From: FriendlyGecko <68018798+FriendlyGecko@users.noreply.github.com> Date: Fri, 16 Feb 2024 20:52:52 +0200 Subject: [PATCH 1/4] added the properties converted platform init check into a one line so that it is in line with the other checks --- arcade/physics_engines.py | 41 +++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/arcade/physics_engines.py b/arcade/physics_engines.py index e824da495..234ae5cdf 100644 --- a/arcade/physics_engines.py +++ b/arcade/physics_engines.py @@ -295,12 +295,9 @@ def __init__(self, self._ladders = None if platforms: - if isinstance(platforms, SpriteList): - self.platforms = [platforms] - else: - self.platforms = list(platforms) + self._platforms = [platforms] if isinstance(platforms, SpriteList) else list(platforms) else: - self.platforms = [] + self._platforms = [] if walls: self.walls = [walls] if isinstance(walls, SpriteList) else list(walls) @@ -319,7 +316,7 @@ def ladders(self): return self._ladders @ladders.setter - def ladders(self, ladders: Union[SpriteList, Iterable[SpriteList]]): + def ladders(self, ladders: Optional[Union[SpriteList, Iterable[SpriteList]]] = None): if ladders: self._ladders = [ladders] if isinstance(ladders, SpriteList) else list(ladders) else: @@ -329,6 +326,38 @@ def ladders(self, ladders: Union[SpriteList, Iterable[SpriteList]]): def ladders(self): self._ladders = None + @property + def platforms(self): + """ The moving platform list registered with the physics engine.""" + return self._platforms + + @platforms.setter + def platforms(self, platforms: Optional[Union[SpriteList, Iterable[SpriteList]]] = None): + if platforms: + self._platforms = [platforms] if isinstance(platforms, SpriteList) else list(platforms) + else: + self._platforms = [] + + @platforms.deleter + def platforms(self): + self._ladders = None + + @property + def walls(self): + """ The wall list registered with the physics engine.""" + return self._walls + + @walls.setter + def walls(self, walls: Optional[Union[SpriteList, Iterable[SpriteList]]] = None): + if walls: + self._walls = [walls] if isinstance(walls, SpriteList) else list(walls) + else: + self._walls = [] + + @walls.deleter + def walls(self): + self._walls = None + def is_on_ladder(self): """ Return 'true' if the player is in contact with a sprite in the ladder list. """ # Check for touching a ladder From 1031283be75027110f9e2d4c09b3d867a6202896 Mon Sep 17 00:00:00 2001 From: FriendlyGecko <68018798+FriendlyGecko@users.noreply.github.com> Date: Fri, 16 Feb 2024 21:17:24 +0200 Subject: [PATCH 2/4] fixed deleter properties for platforms/walls --- arcade/physics_engines.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/arcade/physics_engines.py b/arcade/physics_engines.py index 234ae5cdf..f00fd4aeb 100644 --- a/arcade/physics_engines.py +++ b/arcade/physics_engines.py @@ -286,8 +286,8 @@ def __init__(self, walls: Optional[Union[SpriteList, Iterable[SpriteList]]] = None, ): self._ladders: Optional[List[SpriteList]] - self.platforms: List[SpriteList] - self.walls: List[SpriteList] + self._platforms: List[SpriteList] + self._walls: List[SpriteList] if ladders: self._ladders = [ladders] if isinstance(ladders, SpriteList) else list(ladders) @@ -300,9 +300,9 @@ def __init__(self, self._platforms = [] if walls: - self.walls = [walls] if isinstance(walls, SpriteList) else list(walls) + self._walls = [walls] if isinstance(walls, SpriteList) else list(walls) else: - self.walls = [] + self._walls = [] self.player_sprite: Sprite = player_sprite self.gravity_constant: float = gravity_constant @@ -310,6 +310,7 @@ def __init__(self, self.allowed_jumps: int = 1 self.allow_multi_jump: bool = False + # The property object for ladders. This allows us setter/getter/deleter capabilities in safe manner @property def ladders(self): """ The ladder list registered with the physics engine.""" @@ -340,7 +341,7 @@ def platforms(self, platforms: Optional[Union[SpriteList, Iterable[SpriteList]]] @platforms.deleter def platforms(self): - self._ladders = None + self._platforms = [] @property def walls(self): @@ -356,7 +357,8 @@ def walls(self, walls: Optional[Union[SpriteList, Iterable[SpriteList]]] = None) @walls.deleter def walls(self): - self._walls = None + print("DELETED") + self._walls = [] def is_on_ladder(self): """ Return 'true' if the player is in contact with a sprite in the ladder list. """ From 533a4e0aabdab86770275f830be1dab391b341dd Mon Sep 17 00:00:00 2001 From: FriendlyGecko <68018798+FriendlyGecko@users.noreply.github.com> Date: Sat, 17 Feb 2024 10:52:34 +0200 Subject: [PATCH 3/4] added property to the simple engine so wall list can be updated on it --- arcade/physics_engines.py | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/arcade/physics_engines.py b/arcade/physics_engines.py index f00fd4aeb..d48ed82ac 100644 --- a/arcade/physics_engines.py +++ b/arcade/physics_engines.py @@ -220,8 +220,6 @@ def _move_sprite(moving_sprite: Sprite, walls: List[SpriteList[SpriteType]], ram # print(f"Move 2 - {end_time - start_time:7.4f} {loop_count}") return complete_hit_list - - class PhysicsEngineSimple: """ Simplistic physics engine for use in games without gravity, such as top-down @@ -233,18 +231,29 @@ class PhysicsEngineSimple: This can be one or multiple spritelists. """ - def __init__(self, player_sprite: Sprite, walls: Union[SpriteList[BasicSprite], Iterable[SpriteList[BasicSprite]]]): - assert isinstance(player_sprite, Sprite) + def __init__(self, player_sprite: Sprite, walls: Optional[Union[SpriteList, Iterable[SpriteList]]] = None): + self.player_sprite: Sprite = player_sprite + self._walls: List[SpriteList] if walls: - if isinstance(walls, SpriteList): - self.walls = [cast(SpriteList[BasicSprite], walls)] - else: - self.walls = list(walls) + self._walls = [walls] if isinstance(walls, SpriteList) else list(walls) else: - self.walls = [] + self._walls = [] + + @property + def walls(self): + return self._walls - self.player_sprite = player_sprite + @walls.setter + def walls(self, walls: Optional[Union[SpriteList, Iterable[SpriteList]]] = None): + if walls: + self._walls = [walls] if isinstance(walls, SpriteList) else list(walls) + else: + self._walls = [] + + @walls.deleter + def walls(self): + self._walls = [] def update(self): """ From cd28412ff345d447ab6ece2eab5145c344487c1f Mon Sep 17 00:00:00 2001 From: FriendlyGecko <68018798+FriendlyGecko@users.noreply.github.com> Date: Sat, 17 Feb 2024 11:31:49 +0200 Subject: [PATCH 4/4] Removed old imports BasicSprite type was removed from simple physics engine. Only statement that used it was the engine's wall list init setter statement. Where it limited the spritelist's contents to basic sprites only. Typing.cast was also removed as it seemingly doesn't do anything that explicitly setting the type. --- arcade/physics_engines.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/arcade/physics_engines.py b/arcade/physics_engines.py index d48ed82ac..0ec18aa3d 100644 --- a/arcade/physics_engines.py +++ b/arcade/physics_engines.py @@ -5,10 +5,9 @@ # pylint: disable=too-many-arguments, too-many-locals, too-few-public-methods import math -from typing import Iterable, List, Optional, Union, cast +from typing import Iterable, List, Optional, Union from arcade import ( - BasicSprite, Sprite, SpriteList, SpriteType, @@ -301,7 +300,7 @@ def __init__(self, if ladders: self._ladders = [ladders] if isinstance(ladders, SpriteList) else list(ladders) else: - self._ladders = None + self._ladders = [] if platforms: self._platforms = [platforms] if isinstance(platforms, SpriteList) else list(platforms) @@ -330,11 +329,11 @@ def ladders(self, ladders: Optional[Union[SpriteList, Iterable[SpriteList]]] = N if ladders: self._ladders = [ladders] if isinstance(ladders, SpriteList) else list(ladders) else: - self._ladders = None + self._ladders = [] @ladders.deleter def ladders(self): - self._ladders = None + self._ladders = [] @property def platforms(self): @@ -366,7 +365,6 @@ def walls(self, walls: Optional[Union[SpriteList, Iterable[SpriteList]]] = None) @walls.deleter def walls(self): - print("DELETED") self._walls = [] def is_on_ladder(self):