From 897df74f77377ed8c78a67db1ad6cd14274ade48 Mon Sep 17 00:00:00 2001 From: Simon Cross Date: Tue, 6 Sep 2016 22:28:09 +0200 Subject: [PATCH] Add obstacle manager and move nearest calculation to light manager. --- tabakrolletjie/lights.py | 11 +++++++++++ tabakrolletjie/obstacles.py | 15 +++++++++++++++ tabakrolletjie/scenes/day.py | 27 +++++++-------------------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/tabakrolletjie/lights.py b/tabakrolletjie/lights.py index 8abb1a6..54da531 100644 --- a/tabakrolletjie/lights.py +++ b/tabakrolletjie/lights.py @@ -3,6 +3,7 @@ import pymunk import pymunk.pygame_util +import pygame.display import pygame.draw from .constants import ( @@ -73,6 +74,16 @@ class LightManager(object): for light in self._lights: light.add(self._space) + def nearest(self, pos, surfpos=False, max_distance=1.0): + if surfpos: + surface = pygame.display.get_surface() + pos = pymunk.pygame_util.from_pygame(pos, surface) + point_info = self._space.point_query_nearest( + pos, 1.0, pymunk.ShapeFilter(mask=FITTINGS_CATEGORY)) + if point_info is not None: + return point_info.shape.body.light + return None + def render_light(self, surface): for light in self._lights: light.render_light(surface) diff --git a/tabakrolletjie/obstacles.py b/tabakrolletjie/obstacles.py index 32df5b4..b368626 100644 --- a/tabakrolletjie/obstacles.py +++ b/tabakrolletjie/obstacles.py @@ -9,6 +9,21 @@ from .constants import OBSTACLE_CATEGORY OBSTACLE_FILTER = pymunk.ShapeFilter(categories=OBSTACLE_CATEGORY) +class ObstacleManager(object): + """ Manages a set of obstacles. """ + + def __init__(self, space, gamestate): + self._space = space + self._obstacles = [ + BaseObstacle.load(cfg) for cfg in gamestate.station["obstacles"]] + for obs in self._obstacles: + obs.add(self._space) + + def render(self, surface): + for obs in self._obstacles: + obs.render(surface) + + class BaseObstacle(object): def __init__(self): self.body = pymunk.Body(0, 0, pymunk.body.Body.STATIC) diff --git a/tabakrolletjie/scenes/day.py b/tabakrolletjie/scenes/day.py index 3c5a6b8..26440ef 100644 --- a/tabakrolletjie/scenes/day.py +++ b/tabakrolletjie/scenes/day.py @@ -1,44 +1,34 @@ """ Be prepared. """ -import pygame.display import pygame.locals as pgl import pymunk import pymunk.pygame_util from .base import BaseScene -from ..constants import FITTINGS_CATEGORY from ..lights import LightManager -from ..obstacles import BaseObstacle +from ..obstacles import ObstacleManager from ..events import SceneChangeEvent from ..utils import debug_timer -CLICK_FILTER = pymunk.ShapeFilter(mask=FITTINGS_CATEGORY) - class DayScene(BaseScene): def enter(self, gamestate): self._space = pymunk.Space() - self._obstacles = [ - BaseObstacle.load(cfg) for cfg in gamestate.station["obstacles"]] - for obs in self._obstacles: - obs.add(self._space) + self._obstacles = ObstacleManager(self._space, gamestate) self._lights = LightManager(self._space, gamestate) @debug_timer("day.render") def render(self, surface, gamestate): surface.fill((0, 0, 155)) self._lights.render_light(surface) - for obs in self._obstacles: - obs.render(surface) + self._obstacles.render(surface) self._lights.render_fittings(surface) - def left_click(self, surfpos): - pos = pymunk.pygame_util.from_pygame( - surfpos, pygame.display.get_surface()) - point_info = self._space.point_query_nearest(pos, 1.0, CLICK_FILTER) - if point_info is not None: - point_info.shape.body.light.toggle() + def left_click(self, pos): + light = self._lights.nearest(pos, surfpos=True) + if light: + light.toggle() def right_click(self, pos): pass @@ -48,9 +38,6 @@ class DayScene(BaseScene): if ev.key in (pgl.K_q, pgl.K_ESCAPE): from .menu import MenuScene SceneChangeEvent.post(scene=MenuScene()) - elif ev.key == pgl.K_t: - for light in self._lights: - light.toggle() elif ev.type == pgl.MOUSEBUTTONDOWN: if ev.button == 1: self.left_click(ev.pos) -- 2.34.1