diff nagslang/game_object.py @ 81:a1b4d09e6f23

Floor switch with horrible hackery.
author davidsharpe@lantea.local
date Sun, 01 Sep 2013 22:53:37 +0200
parents 7f038ee778ad
children 11b0017b5e4b
line wrap: on
line diff
--- a/nagslang/game_object.py	Sun Sep 01 22:36:49 2013 +0200
+++ b/nagslang/game_object.py	Sun Sep 01 22:53:37 2013 +0200
@@ -1,5 +1,28 @@
 import math
 
+import pygame
+import pymunk
+
+from nagslang.constants import SWITCH_PUSHERS, COLLISION_TYPE_SWITCH
+
+class Puzzler(object):
+    def get_state(self, space):
+        raise NotImplementedError()
+
+    def notify(self):
+        pass
+
+
+class FloorSwitchPuzzler(Puzzler):
+    def __init__(self, shape):
+        self.shape = shape
+
+    def get_state(self, space):
+        for shape in space.shape_query(self.shape):
+            if shape.collision_type in SWITCH_PUSHERS:
+                return True
+        return False
+
 
 class Physicser(object):
     def add_to_space(self, space):
@@ -98,11 +121,12 @@
     This has a rendery thing, physicsy things and maybe some other things.
     """
 
-    def __init__(self, renderer, physicser=None):
+    def __init__(self, renderer, physicser=None, puzzler=None):
         self.renderer = renderer
         if physicser is None:
             physicser = NullPhysicser()
         self.physicser = physicser
+        self.puzzler = puzzler
 
     def add_to_space(self, space):
         self.physicser.add_to_space(space)
@@ -111,3 +135,28 @@
         return self.renderer.render(
             surface, self.physicser.render_position(surface),
             self.physicser.render_angle())
+
+
+class FloorSwitch(GameObject):
+    def __init__(self, position):
+        body = pymunk.Body()
+        body.position = position
+        self.shape = pymunk.Circle(body, 30)
+        self.shape.collision_type = COLLISION_TYPE_SWITCH
+        self.shape.sensor = True
+        super(FloorSwitch, self).__init__(
+            ShapeRenderer(self.shape),
+            SingleShapePhysicser(self.shape),
+            FloorSwitchPuzzler(self.shape),
+        )
+
+    def add_to_space(self, space):
+        # XXX: Hacky hack.
+        self._space = space
+
+    def render(self, surface):
+        if self.puzzler.get_state(self._space):
+            self.shape.color = pygame.color.THECOLORS['green']
+        else:
+            self.shape.color = pygame.color.THECOLORS['red']
+        super(FloorSwitch, self).render(surface)
\ No newline at end of file