Add TestVelocityObject to simulate moving entities in the world
All checks were successful
Build Simulation and Test / Run All Tests (push) Successful in 2m13s

This commit is contained in:
Sam 2025-06-07 22:58:18 -05:00
parent ac08ecbc27
commit a64e705731
2 changed files with 72 additions and 3 deletions

View File

@ -4,7 +4,7 @@ import sys
import random
from world.world import World, Position
from world.render_objects import DebugRenderObject, FoodObject
from world.render_objects import DebugRenderObject, FoodObject, TestVelocityObject
from world.simulation_interface import Camera
# Initialize Pygame
@ -62,7 +62,7 @@ def draw_grid(screen, camera, showing_grid=True):
):
return # Grid is completely off-screen
# Fill the grid area with dark gray background
# Fill the grid area awith dark gray background
grid_rect = pygame.Rect(
max(0, grid_left),
max(0, grid_top),
@ -146,11 +146,13 @@ def main():
world = World(CELL_SIZE, (CELL_SIZE * GRID_WIDTH, CELL_SIZE * GRID_HEIGHT))
# sets seed to 67 >_<
random.seed(67)
random.seed(0)
if FOOD_SPAWNING:
world.add_object(FoodObject(Position(x=random.randint(-100, 100), y=random.randint(-100, 100))))
world.add_object(TestVelocityObject(Position(x=random.randint(-100, 100), y=random.randint(-100, 100))))
running = True
while running:
deltatime = clock.get_time() / 1000.0 # Convert milliseconds to seconds

View File

@ -171,3 +171,70 @@ class FoodObject(BaseEntity):
:return: String representation.
"""
return f"FoodObject({self.position}, decay={self.decay:.1f}, decay_rate={self.decay_rate * (1 + (self.neighbors / 10))})"
class TestVelocityObject(BaseEntity):
"""
Test object that moves in a randomly set direction.
"""
def __init__(self, position: Position) -> None:
"""
Initializes the test velocity object.
:param position: The position of the object.
"""
super().__init__(position)
self.velocity = (random.uniform(-0.1, 0.5), random.uniform(-0.1, 0.5))
self.max_visual_width: int = 10
self.interaction_radius: int = 50
self.flags: dict[str, bool] = {
"death": False,
"can_interact": True,
}
def tick(self, interactable: Optional[List[BaseEntity]] = None) -> "TestVelocityObject":
"""
Updates the object by moving it according to its velocity.
:param interactable: List of nearby entities (unused).
:return: Self.
"""
if interactable is None:
interactable = []
x, y = self.position.get_position()
x += self.velocity[0]
y += self.velocity[1]
self.position.set_position(x, y)
return self
def render(self, camera: Any, screen: Any) -> None:
"""
Renders the test object as a circle.
:param camera: The camera object for coordinate transformation.
:param screen: The Pygame screen surface.
"""
if camera.is_in_view(*self.position.get_position()):
pygame.draw.circle(
screen,
(0, 255, 0),
camera.world_to_screen(*self.position.get_position()),
int(5 * camera.zoom)
)
def __repr__(self) -> str:
"""
Returns a string representation of the test object.
:return: String representation.
"""
return f"TestVelocityObject({self.position}, velocity={self.velocity})"
class DefaultCell(BaseEntity):
"""
Cell object
"""