changeset 106:bce9cd8a4a8c

FloorLight, linked to a FloorSwitch.
author Jeremy Thurgood <firxen@gmail.com>
date Mon, 02 Sep 2013 13:48:24 +0200
parents 0131e4606e1a
children b90d01e4d9d4
files nagslang/game_object.py nagslang/screens/area.py
diffstat 2 files changed, 57 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/game_object.py	Mon Sep 02 13:29:30 2013 +0200
+++ b/nagslang/game_object.py	Mon Sep 02 13:48:24 2013 +0200
@@ -8,13 +8,29 @@
 from nagslang.options import options
 
 
+class PuzzleGlue(object):
+    """Glue that holds bits of a puzzle together.
+    """
+    def __init__(self):
+        self._components = {}
+
+    def add_component(self, name, puzzler):
+        self._components[name] = puzzler
+        puzzler.set_glue(self)
+
+    def get_state_of(self, name):
+        return self._components[name].get_state()
+
+
 class Puzzler(object):
-    def get_state(self, space):
+    """Behaviour specific to a puzzle component.
+    """
+    def set_glue(self, glue):
+        self.glue = glue
+
+    def get_state(self):
         raise NotImplementedError()
 
-    def notify(self):
-        pass
-
 
 class FloorSwitchPuzzler(Puzzler):
     def __init__(self, space, shape):
@@ -28,6 +44,14 @@
         return False
 
 
+class StateProxyPuzzler(Puzzler):
+    def __init__(self, state_source):
+        self._state_source = state_source
+
+    def get_state(self):
+        return self.glue.get_state_of(self._state_source)
+
+
 class Physicser(object):
     def __init__(self, space):
         self.space = space
@@ -185,3 +209,24 @@
         else:
             self.shape.color = pygame.color.THECOLORS['red']
         super(FloorSwitch, self).render(surface)
+
+
+class FloorLight(GameObject):
+    def __init__(self, space, position, state_source):
+        body = pymunk.Body()
+        body.position = position
+        self.shape = pymunk.Circle(body, 10)
+        self.shape.collision_type = COLLISION_TYPE_SWITCH
+        self.shape.sensor = True
+        super(FloorLight, self).__init__(
+            SingleShapePhysicser(space, self.shape),
+            ShapeRenderer(self.shape),
+            StateProxyPuzzler(state_source),
+        )
+
+    def render(self, surface):
+        if self.puzzler.get_state():
+            self.shape.color = pygame.color.THECOLORS['green']
+        else:
+            self.shape.color = pygame.color.THECOLORS['red']
+        super(FloorLight, self).render(surface)
--- a/nagslang/screens/area.py	Mon Sep 02 13:29:30 2013 +0200
+++ b/nagslang/screens/area.py	Mon Sep 02 13:48:24 2013 +0200
@@ -5,7 +5,7 @@
 import pymunk.pygame_util
 
 from nagslang.events import ScreenChange
-from nagslang.game_object import FloorSwitch
+from nagslang.game_object import FloorSwitch, FloorLight, PuzzleGlue
 from nagslang.level import Level
 from nagslang.protagonist import Protagonist
 from nagslang.screens.base import Screen
@@ -53,7 +53,13 @@
         self.add_walls()
         self.add_protagonist()
         # TODO: Put this in a level instead:
-        self._drawables.append(FloorSwitch(self.space, (300, 400)))
+        glue = PuzzleGlue()
+        switch = FloorSwitch(self.space, (300, 400))
+        light = FloorLight(self.space, (300, 500), 'switch')
+        glue.add_component('switch', switch.puzzler)
+        glue.add_component('light', light.puzzler)
+        self._drawables.append(switch)
+        self._drawables.append(light)
 
     def add_walls(self):
         self.walls = []