Compare commits
2
Commits
8c414fe294
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9114238ef8 | ||
|
|
863f39c2d2 |
No files matched your search
+1
-1
Submodule libs/ecs updated: 8ad4106b36...ce5eedbea2.
@@ -0,0 +1,6 @@
|
|||||||
|
from src.game import Game
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
game = Game()
|
||||||
|
|
||||||
|
game.run()
|
||||||
File renamed without changes.
+85
@@ -0,0 +1,85 @@
|
|||||||
|
from dataclasses import dataclass, field
|
||||||
|
from random import randint
|
||||||
|
from typing import cast
|
||||||
|
|
||||||
|
import pyglet
|
||||||
|
from pyglet.window import Window
|
||||||
|
from pyglet.window.mouse import LEFT
|
||||||
|
from pyglet.shapes import Circle, Line
|
||||||
|
from src.components import (
|
||||||
|
PlanetMarker,
|
||||||
|
Position,
|
||||||
|
Radius,
|
||||||
|
SpaceShipMarker,
|
||||||
|
Vector2D,
|
||||||
|
)
|
||||||
|
from src.helpers import generate_random_planet
|
||||||
|
from src.world import world
|
||||||
|
from settings import FPS, FULLSCREEN, SCREEN_WIDTH, SCREEN_HEIGHT
|
||||||
|
|
||||||
|
|
||||||
|
class Game(Window):
|
||||||
|
def __init__(self, *args, **kwargs) -> None:
|
||||||
|
super(Game, self).__init__(
|
||||||
|
caption="SpaceTrader",
|
||||||
|
width=SCREEN_WIDTH,
|
||||||
|
height=SCREEN_HEIGHT,
|
||||||
|
fullscreen=FULLSCREEN,
|
||||||
|
)
|
||||||
|
self.world = world
|
||||||
|
for _ in range(12):
|
||||||
|
generate_random_planet(self.world)
|
||||||
|
|
||||||
|
def on_draw(self):
|
||||||
|
self.clear()
|
||||||
|
for _, line in self.world.state.routes.items():
|
||||||
|
line.draw()
|
||||||
|
|
||||||
|
for _, component_storage in self.world.query(SpaceShipMarker):
|
||||||
|
component_storage[Circle].draw()
|
||||||
|
|
||||||
|
for _, component_storage in self.world.query(PlanetMarker):
|
||||||
|
component_storage[Circle].draw()
|
||||||
|
|
||||||
|
def on_mouse_release(self, x, y, button, modifiers):
|
||||||
|
if button != LEFT:
|
||||||
|
return
|
||||||
|
closest_entity, component_storage = min(
|
||||||
|
self.world.query(PlanetMarker),
|
||||||
|
key=lambda p: abs(p[1][Position] - Vector2D(x, y)),
|
||||||
|
)
|
||||||
|
pos = component_storage[Position]
|
||||||
|
if component_storage[Radius].value < abs(pos - Vector2D(x, y)):
|
||||||
|
print("DESELECT")
|
||||||
|
self.world.state.selected_planet = None
|
||||||
|
elif self.world.state.selected_planet is None:
|
||||||
|
print("SELECT")
|
||||||
|
self.world.state.selected_planet = closest_entity
|
||||||
|
elif self.world.state.selected_planet != closest_entity:
|
||||||
|
first_planet, second_planet = (
|
||||||
|
(self.world.state.selected_planet, closest_entity)
|
||||||
|
if self.world.state.selected_planet > closest_entity
|
||||||
|
else (closest_entity, self.world.state.selected_planet)
|
||||||
|
)
|
||||||
|
fpos: Position = self.world.get_components(first_planet)[Position]
|
||||||
|
spos: Position = self.world.get_components(second_planet)[Position]
|
||||||
|
route_key = (first_planet, second_planet)
|
||||||
|
if route_key in self.world.state.routes:
|
||||||
|
print("ROUTE DELETE")
|
||||||
|
self.world.state.routes.pop(route_key)
|
||||||
|
else:
|
||||||
|
print("ROUTE CREATE")
|
||||||
|
self.world.state.routes[route_key] = Line(
|
||||||
|
x=fpos.x,
|
||||||
|
y=fpos.y,
|
||||||
|
x2=spos.x,
|
||||||
|
y2=spos.y,
|
||||||
|
)
|
||||||
|
self.world.state.selected_planet = None
|
||||||
|
|
||||||
|
def on_update(self, dt):
|
||||||
|
self.world.tick(dt=dt)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
pyglet.clock.schedule_interval(self.on_update, 1 / FPS)
|
||||||
|
pyglet.app.run()
|
||||||
@@ -2,8 +2,8 @@ from dataclasses import dataclass, field
|
|||||||
from typing import cast
|
from typing import cast
|
||||||
|
|
||||||
from pyglet.shapes import Circle, Line
|
from pyglet.shapes import Circle, Line
|
||||||
from libs.ecs.world import World
|
from libs.ecs.world import BaseWorld
|
||||||
from components import (
|
from src.components import (
|
||||||
Color,
|
Color,
|
||||||
PlanetMarker,
|
PlanetMarker,
|
||||||
Position,
|
Position,
|
||||||
@@ -22,17 +22,10 @@ from settings import (
|
|||||||
SPACESHIP_PATH_COLOR,
|
SPACESHIP_PATH_COLOR,
|
||||||
SPACESHIP_RADIUS,
|
SPACESHIP_RADIUS,
|
||||||
)
|
)
|
||||||
from libs.ecs.state import BaseGameState
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class GameState(BaseGameState):
|
|
||||||
selected_planet: int | None = None
|
|
||||||
routes: dict[tuple[int, int], "Line"] = field(default_factory=dict)
|
|
||||||
|
|
||||||
|
|
||||||
def create_planet(
|
def create_planet(
|
||||||
world: World,
|
world: BaseWorld,
|
||||||
x: float,
|
x: float,
|
||||||
y: float,
|
y: float,
|
||||||
radius: int,
|
radius: int,
|
||||||
@@ -48,7 +41,7 @@ def create_planet(
|
|||||||
|
|
||||||
|
|
||||||
def create_spaceship(
|
def create_spaceship(
|
||||||
world: World,
|
world: BaseWorld,
|
||||||
src_x: float,
|
src_x: float,
|
||||||
src_y: float,
|
src_y: float,
|
||||||
dest_x: float,
|
dest_x: float,
|
||||||
@@ -69,7 +62,7 @@ def create_spaceship(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def generate_random_planet(world: World) -> int:
|
def generate_random_planet(world: BaseWorld) -> int:
|
||||||
radius: int = randint(MIN_PLANET_RADIUS, MAX_PLANET_RADIUS)
|
radius: int = randint(MIN_PLANET_RADIUS, MAX_PLANET_RADIUS)
|
||||||
x: float = float(randint(radius, SCREEN_WIDTH - radius))
|
x: float = float(randint(radius, SCREEN_WIDTH - radius))
|
||||||
y: float = float(randint(radius, SCREEN_HEIGHT - radius))
|
y: float = float(randint(radius, SCREEN_HEIGHT - radius))
|
||||||
@@ -79,7 +72,7 @@ def generate_random_planet(world: World) -> int:
|
|||||||
|
|
||||||
|
|
||||||
def create_travelling_spaceship(
|
def create_travelling_spaceship(
|
||||||
world: World,
|
world: BaseWorld,
|
||||||
src_planet: int,
|
src_planet: int,
|
||||||
dest_planet: int,
|
dest_planet: int,
|
||||||
):
|
):
|
||||||
@@ -103,7 +96,7 @@ def create_travelling_spaceship(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def generate_random_spaceship(world: World) -> int:
|
def generate_random_spaceship(world: BaseWorld) -> int:
|
||||||
planets = [entity for entity, _ in world.query(PlanetMarker)]
|
planets = [entity for entity, _ in world.query(PlanetMarker)]
|
||||||
|
|
||||||
_planet_sample = sample(planets, 2)
|
_planet_sample = sample(planets, 2)
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
from pyglet.shapes import Line
|
||||||
|
|
||||||
|
from libs.ecs.state import BaseGameState
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class GameState(BaseGameState):
|
||||||
|
selected_planet: int | None = None
|
||||||
|
routes: dict[tuple[int, int], "Line"] = field(default_factory=dict)
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
from pyglet.shapes import Circle
|
from pyglet.shapes import Circle
|
||||||
|
|
||||||
from libs.ecs.world import World
|
from libs.ecs.world import BaseWorld
|
||||||
from components import (
|
from src.components import (
|
||||||
PlanetMarker,
|
PlanetMarker,
|
||||||
Position,
|
Position,
|
||||||
Color,
|
Color,
|
||||||
@@ -15,7 +15,7 @@ from settings import SPACESHIP_COLOR, SPACESHIP_RADIUS, SPACESHIP_SPEED
|
|||||||
|
|
||||||
class PlanetRenderSyncSystem:
|
class PlanetRenderSyncSystem:
|
||||||
@classmethod
|
@classmethod
|
||||||
def process(cls, world: World, **args):
|
def process(cls, world: BaseWorld, **args):
|
||||||
for _, component_storage in world.query(PlanetMarker):
|
for _, component_storage in world.query(PlanetMarker):
|
||||||
pos: Position = component_storage[Position]
|
pos: Position = component_storage[Position]
|
||||||
color: Color = component_storage[Color]
|
color: Color = component_storage[Color]
|
||||||
@@ -28,7 +28,7 @@ class PlanetRenderSyncSystem:
|
|||||||
|
|
||||||
class SpaceShipRenderSyncSystem:
|
class SpaceShipRenderSyncSystem:
|
||||||
@classmethod
|
@classmethod
|
||||||
def process(cls, world: World, **args):
|
def process(cls, world: BaseWorld, **args):
|
||||||
for _, component_storage in world.query(SpaceShipMarker):
|
for _, component_storage in world.query(SpaceShipMarker):
|
||||||
pos: Position = component_storage[Position]
|
pos: Position = component_storage[Position]
|
||||||
circle: Circle = component_storage[Circle]
|
circle: Circle = component_storage[Circle]
|
||||||
@@ -39,7 +39,7 @@ class SpaceShipRenderSyncSystem:
|
|||||||
|
|
||||||
class SpaceShipKillSystem:
|
class SpaceShipKillSystem:
|
||||||
@classmethod
|
@classmethod
|
||||||
def process(cls, world: World, **args):
|
def process(cls, world: BaseWorld, **args):
|
||||||
marked_for_death = []
|
marked_for_death = []
|
||||||
for entity, component_storage in world.query(SpaceShipMarker):
|
for entity, component_storage in world.query(SpaceShipMarker):
|
||||||
pos: Position = component_storage[Position]
|
pos: Position = component_storage[Position]
|
||||||
@@ -53,7 +53,7 @@ class SpaceShipKillSystem:
|
|||||||
|
|
||||||
class SpaceShipTravelSystem:
|
class SpaceShipTravelSystem:
|
||||||
@classmethod
|
@classmethod
|
||||||
def process(cls, world: World, **args):
|
def process(cls, world: BaseWorld, **args):
|
||||||
for _, component_storage in world.query(SpaceShipMarker):
|
for _, component_storage in world.query(SpaceShipMarker):
|
||||||
pos: Position = component_storage[Position]
|
pos: Position = component_storage[Position]
|
||||||
target: Destination = component_storage[Destination]
|
target: Destination = component_storage[Destination]
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
from pyglet.shapes import Line
|
||||||
|
|
||||||
|
from libs.ecs.world import BaseWorld
|
||||||
|
from libs.ecs.state import BaseGameState
|
||||||
|
from src.systems import (
|
||||||
|
PlanetRenderSyncSystem,
|
||||||
|
SpaceShipKillSystem,
|
||||||
|
SpaceShipRenderSyncSystem,
|
||||||
|
SpaceShipTravelSystem,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class GameState(BaseGameState):
|
||||||
|
selected_planet: int | None = None
|
||||||
|
routes: dict[tuple[int, int], "Line"] = field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class World(BaseWorld):
|
||||||
|
state: GameState = field(default_factory=GameState)
|
||||||
|
|
||||||
|
|
||||||
|
world = World()
|
||||||
|
world.systems.extend(
|
||||||
|
(
|
||||||
|
SpaceShipKillSystem,
|
||||||
|
PlanetRenderSyncSystem,
|
||||||
|
SpaceShipRenderSyncSystem,
|
||||||
|
SpaceShipTravelSystem,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
from helpers import normalize_name, load_items
|
from src.helpers import normalize_name, load_items
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
items = load_items("assets/goods.txt")
|
items = load_items("assets/goods.txt")
|
||||||
|
|||||||
@@ -1,106 +0,0 @@
|
|||||||
from dataclasses import dataclass, field
|
|
||||||
from random import randint
|
|
||||||
from typing import cast
|
|
||||||
|
|
||||||
import pyglet
|
|
||||||
from pyglet.window.mouse import LEFT
|
|
||||||
from pyglet.shapes import Circle, Line
|
|
||||||
from components import (
|
|
||||||
PlanetMarker,
|
|
||||||
Position,
|
|
||||||
Radius,
|
|
||||||
SpaceShipMarker,
|
|
||||||
Vector2D,
|
|
||||||
)
|
|
||||||
from helpers import (
|
|
||||||
GameState,
|
|
||||||
generate_random_planet,
|
|
||||||
)
|
|
||||||
from libs.ecs.world import World
|
|
||||||
from systems import (
|
|
||||||
PlanetRenderSyncSystem,
|
|
||||||
SpaceShipKillSystem,
|
|
||||||
SpaceShipRenderSyncSystem,
|
|
||||||
SpaceShipTravelSystem,
|
|
||||||
)
|
|
||||||
from settings import FPS, FULLSCREEN, SCREEN_WIDTH, SCREEN_HEIGHT
|
|
||||||
|
|
||||||
game_state = GameState()
|
|
||||||
world = World()
|
|
||||||
world.systems.extend(
|
|
||||||
(
|
|
||||||
SpaceShipKillSystem,
|
|
||||||
PlanetRenderSyncSystem,
|
|
||||||
SpaceShipRenderSyncSystem,
|
|
||||||
SpaceShipTravelSystem,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
window = pyglet.window.Window(
|
|
||||||
caption="SpaceTrader",
|
|
||||||
width=SCREEN_WIDTH,
|
|
||||||
height=SCREEN_HEIGHT,
|
|
||||||
fullscreen=FULLSCREEN,
|
|
||||||
)
|
|
||||||
|
|
||||||
for _ in range(12):
|
|
||||||
generate_random_planet(world)
|
|
||||||
|
|
||||||
|
|
||||||
@window.event
|
|
||||||
def on_draw():
|
|
||||||
window.clear()
|
|
||||||
for _, line in game_state.routes.items():
|
|
||||||
line.draw()
|
|
||||||
|
|
||||||
for _, component_storage in world.query(SpaceShipMarker):
|
|
||||||
component_storage[Circle].draw()
|
|
||||||
|
|
||||||
for _, component_storage in world.query(PlanetMarker):
|
|
||||||
component_storage[Circle].draw()
|
|
||||||
|
|
||||||
|
|
||||||
@window.event
|
|
||||||
def on_mouse_release(x, y, button, modifiers):
|
|
||||||
if button != LEFT:
|
|
||||||
return
|
|
||||||
closest_entity, component_storage = min(
|
|
||||||
world.query(PlanetMarker),
|
|
||||||
key=lambda p: abs(p[1][Position] - Vector2D(x, y)),
|
|
||||||
)
|
|
||||||
pos = component_storage[Position]
|
|
||||||
if component_storage[Radius].value < abs(pos - Vector2D(x, y)):
|
|
||||||
print("DESELECT")
|
|
||||||
game_state.selected_planet = None
|
|
||||||
elif game_state.selected_planet is None:
|
|
||||||
print("SELECT")
|
|
||||||
game_state.selected_planet = closest_entity
|
|
||||||
elif game_state.selected_planet != closest_entity:
|
|
||||||
first_planet, second_planet = sorted(
|
|
||||||
(game_state.selected_planet, closest_entity)
|
|
||||||
)
|
|
||||||
fpos: Position = cast(dict, world.get_components(first_planet))[Position]
|
|
||||||
spos: Position = cast(dict, world.get_components(second_planet))[Position]
|
|
||||||
route_key = (first_planet, second_planet)
|
|
||||||
if route_key in game_state.routes:
|
|
||||||
print("ROUTE DELETE")
|
|
||||||
game_state.routes.pop(route_key)
|
|
||||||
else:
|
|
||||||
print("ROUTE CREATE")
|
|
||||||
game_state.routes[route_key] = Line(
|
|
||||||
x=fpos.x,
|
|
||||||
y=fpos.y,
|
|
||||||
x2=spos.x,
|
|
||||||
y2=spos.y,
|
|
||||||
)
|
|
||||||
game_state.selected_planet = None
|
|
||||||
|
|
||||||
|
|
||||||
def on_update(dt):
|
|
||||||
world.tick(dt=dt)
|
|
||||||
|
|
||||||
|
|
||||||
pyglet.clock.schedule_interval(on_update, 1 / FPS)
|
|
||||||
|
|
||||||
pyglet.app.run()
|
|
||||||
Reference in new issue
Block a user