From b3cdc33078341c62fd86bdcd2d4c44b85cd3a157 Mon Sep 17 00:00:00 2001 From: Simon Cross Date: Sat, 10 Sep 2016 00:17:43 +0200 Subject: [PATCH] Add multi-colour lamp. --- data/stations/station-alpha.json | 6 +++++ tabakrolletjie/lights.py | 40 +++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/data/stations/station-alpha.json b/data/stations/station-alpha.json index 40adfea..84b3910 100644 --- a/data/stations/station-alpha.json +++ b/data/stations/station-alpha.json @@ -39,6 +39,12 @@ "colour": "yellow", "position": [500, 500], "intensity": 0.5 + }, + { + "type": "multicolourlamp", + "colours": ["red", "yellow", "green"], + "position": [300, 300], + "intensity": 0.5 } ] } diff --git a/tabakrolletjie/lights.py b/tabakrolletjie/lights.py index 4c54a49..6f39b70 100644 --- a/tabakrolletjie/lights.py +++ b/tabakrolletjie/lights.py @@ -130,7 +130,7 @@ class BaseLight(object): self.fitting = pymunk.Circle( self.body, self.FITTING_RADIUS, self.ray_manager.position) self.fitting.filter = FITTINGS_FILTER - self._image = None + self._fitting_image = None @property def position(self): @@ -208,27 +208,55 @@ class BaseLight(object): dt.lap("blitted surface") dt.end() - def get_image(self): - if self._image is None: + def fitting_image(self): + if self._fitting_image is None: fitting_colour = self.COLOURS[self.colour] - self._image = loader.load_image( + self._fitting_image = loader.load_image( "48", self.FITTING_IMG, transform=Multiply(colour=fitting_colour)) - return self._image + return self._fitting_image + + def invalidate_fitting_image(self): + self._fitting_image = None def render_fitting(self, surface): rx, ry = self.ray_manager.pygame_position(surface) - surface.blit(self.get_image(), (rx - 24, ry - 24), None, 0) + surface.blit(self.fitting_image(), (rx - 24, ry - 24), None, 0) def tick(self): pass class Lamp(BaseLight): + FITTING_IMG = "lamp.png" +class MultiColourLamp(BaseLight): + + FITTING_IMG = "lamp.png" + DEFAULT_COLOURS = sorted(BaseLight.COLOURS.keys()) + + def __init__(self, **kw): + self.colour_cycle = kw.pop("colours", None) + self.colour_pos = 0 + kw["colour"] = self.colour_cycle[0] + super(MultiColourLamp, self).__init__(**kw) + + def toggle(self): + self.colour_pos += 1 + if self.colour_pos >= len(self.colour_cycle): + self.colour = self.colour_cycle[0] + self.colour_pos = -1 + self.on = False + else: + self.colour = self.colour_cycle[self.colour_pos] + self.on = True + self.invalidate_fitting_image() + + class SpotLight(BaseLight): + FITTING_IMG = "spotlight.png" def __init__(self, **kw): -- 2.34.1