107 lines
2.7 KiB
Python
107 lines
2.7 KiB
Python
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()
|