Files
planetarium/ui.py
T

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()