from random import randint 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 generate_random_planet, generate_random_spaceship from libs.ecs.world import World from libs.ecs.event import EventBus from systems import ( PlanetRenderSyncSystem, SpaceShipKillSystem, SpaceShipRenderSyncSystem, SpaceShipTravelSystem, ) from settings import FPS, FULLSCREEN, SCREEN_WIDTH, SCREEN_HEIGHT 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 _, component_storage in world.query(SpaceShipMarker): component_storage[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: 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("NO PLANET") else: print("PLANET") def on_update(dt): world.tick(dt=dt) def periodic_random_spaceship_generation(*args, **kwargs): for i in range(randint(0, 5)): generate_random_spaceship(world=world) pyglet.clock.schedule_interval(on_update, 1 / FPS) pyglet.clock.schedule_interval(periodic_random_spaceship_generation, 0.5) pyglet.app.run()