Planet and spaceship creation, travel and destruction
This commit is contained in:
1 parent
ca9e8a2f19
commit
90e421909a
7 files changed
+307
No files matched your search
+96
@@ -0,0 +1,96 @@
|
||||
from pyglet.shapes import Circle, Line
|
||||
from libs.ecs import World
|
||||
from components import (
|
||||
Color,
|
||||
PlanetMarker,
|
||||
Position,
|
||||
Radius,
|
||||
SpaceShipMarker,
|
||||
Target,
|
||||
)
|
||||
from random import randint, sample
|
||||
from settings import (
|
||||
MIN_PLANET_RADIUS,
|
||||
MAX_PLANET_RADIUS,
|
||||
SCREEN_WIDTH,
|
||||
SCREEN_HEIGHT,
|
||||
SPACESHIP_COLOR,
|
||||
SPACESHIP_PATH_COLOR,
|
||||
SPACESHIP_RADIUS,
|
||||
)
|
||||
|
||||
|
||||
def create_planet(
|
||||
world: World,
|
||||
x: int,
|
||||
y: int,
|
||||
radius: int,
|
||||
color: tuple[int, int, int, int],
|
||||
) -> int:
|
||||
return world.spawn(
|
||||
PlanetMarker(),
|
||||
Position(x=x, y=y),
|
||||
Color(value=color),
|
||||
Circle(x=x, y=y, radius=radius, color=color),
|
||||
Radius(radius),
|
||||
)
|
||||
|
||||
|
||||
def create_spaceship(
|
||||
world: World,
|
||||
src_x: int,
|
||||
src_y: int,
|
||||
dest_x: int,
|
||||
dest_y: int,
|
||||
approach_radius: int,
|
||||
):
|
||||
return world.spawn(
|
||||
SpaceShipMarker(),
|
||||
Position(x=src_x, y=src_y),
|
||||
Target(x=dest_x, y=dest_y),
|
||||
Radius(approach_radius),
|
||||
Circle(x=src_x, y=src_y, radius=SPACESHIP_RADIUS, color=SPACESHIP_COLOR),
|
||||
Line(x=src_x, y=src_y, x2=dest_x, y2=dest_y, color=SPACESHIP_PATH_COLOR),
|
||||
)
|
||||
|
||||
|
||||
def generate_random_planet(world: World) -> int:
|
||||
radius: int = randint(MIN_PLANET_RADIUS, MAX_PLANET_RADIUS)
|
||||
x: int = randint(radius, SCREEN_WIDTH - radius)
|
||||
y: int = randint(radius, SCREEN_HEIGHT - radius)
|
||||
color = (randint(0, 255), randint(0, 255), randint(0, 255), 255)
|
||||
|
||||
return create_planet(world, x, y, radius, color)
|
||||
|
||||
|
||||
def create_travelling_spaceship(
|
||||
world: World,
|
||||
src_planet: int,
|
||||
dest_planet: int,
|
||||
):
|
||||
src_planet_cs = world.get_components(src_planet)
|
||||
if src_planet_cs is None:
|
||||
raise Exception("invalid_planet")
|
||||
dest_planet_cs = world.get_components(dest_planet)
|
||||
if dest_planet_cs is None:
|
||||
raise Exception("invalid_planet")
|
||||
|
||||
source_pos = src_planet_cs[Position]
|
||||
dest_pos = dest_planet_cs[Position]
|
||||
approach_radius = dest_planet_cs[Radius].value
|
||||
return create_spaceship(
|
||||
world,
|
||||
src_x=source_pos.x,
|
||||
src_y=source_pos.y,
|
||||
dest_x=dest_pos.x,
|
||||
dest_y=dest_pos.y,
|
||||
approach_radius=approach_radius,
|
||||
)
|
||||
|
||||
|
||||
def generate_random_spaceship(world: World) -> int:
|
||||
planets = [entity for entity, _ in world.query(PlanetMarker)]
|
||||
|
||||
_planet_sample = sample(planets, 2)
|
||||
|
||||
return create_travelling_spaceship(world, *_planet_sample)
|
||||
Reference in new issue
Block a user