diff nagslang/game_object.py @ 106:bce9cd8a4a8c

FloorLight, linked to a FloorSwitch.
author Jeremy Thurgood <firxen@gmail.com>
date Mon, 02 Sep 2013 13:48:24 +0200
parents 1be3eebb87c4
children b90d01e4d9d4
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)