changeset 188:3894cfe15823

Better collision handling, potentially locked doors.
author Jeremy Thurgood <firxen@gmail.com>
date Tue, 03 Sep 2013 20:24:25 +0200
parents 42a10c4f70c8
children b6c1a9448d7d
files nagslang/game_object.py nagslang/screens/area.py
diffstat 2 files changed, 18 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/game_object.py	Tue Sep 03 20:10:44 2013 +0200
+++ b/nagslang/game_object.py	Tue Sep 03 20:24:25 2013 +0200
@@ -434,9 +434,6 @@
             puzzler,
         )
 
-    def animate(self):
-        space = self.get_space()
-        for shape in space.shape_query(self.get_shape()):
-            if shape.collision_type == COLLISION_TYPE_PLAYER:
-                # Force to new position
-                DoorEvent.post(self.destination, self.dest_pos)
+    def collide_with_protagonist(self):
+        if self.puzzler.get_state():
+            DoorEvent.post(self.destination, self.dest_pos)
--- a/nagslang/screens/area.py	Tue Sep 03 20:10:44 2013 +0200
+++ b/nagslang/screens/area.py	Tue Sep 03 20:24:25 2013 +0200
@@ -4,6 +4,7 @@
 import pymunk
 import pymunk.pygame_util
 
+from nagslang.constants import COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS
 from nagslang.events import ScreenChange, DoorEvent
 from nagslang.level import Level
 from nagslang.protagonist import Protagonist
@@ -68,6 +69,7 @@
         self._level.load(self.space)
         self._drawables = Drawables()
         self.add_walls()
+        self._add_collision_handlers()
         if self.protagonist is not None:
             # We do things this way to avoid extra pymunk
             # juggling to move objects between spaces
@@ -78,6 +80,19 @@
             self.add_protagonist()
         self.add_game_objects()
 
+    def _collision_pre_solve_handler(self, space, arbiter):
+        gobj = arbiter.shapes[1].physicser.game_object
+        result = gobj.collide_with_protagonist()
+        if result is False:
+            return False
+        return True
+
+    def _add_collision_handlers(self):
+        for collision_type in CALLBACK_COLLIDERS:
+            self.space.add_collision_handler(
+                COLLISION_TYPE_PLAYER, collision_type,
+                pre_solve=self._collision_pre_solve_handler)
+
     def add_walls(self):
         self.walls = []
         body = pymunk.Body()