changeset 188:d76c069164c0

Much better interaction detection.
author Jeremy Thurgood <firxen@gmail.com>
date Wed, 14 Sep 2011 17:41:26 +0200
parents 3449b51ae944
children aeacd8dfeb07
files mamba/snake.py mamba/world.py
diffstat 2 files changed, 14 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/snake.py	Wed Sep 14 16:31:51 2011 +0200
+++ b/mamba/snake.py	Wed Sep 14 17:41:26 2011 +0200
@@ -1,6 +1,6 @@
 """The player snake object."""
 
-from pygame.sprite import Group
+from pygame.sprite import Group, spritecollide
 from pygame.locals import BLEND_MULT
 
 from mamba.constants import TILE_SIZE
@@ -45,16 +45,15 @@
             shifted, ds = self.head.shift_head(ds)
             if not shifted:
                 break
-            world.interact(self.head)
             self.head.set_orientation(self.orientation)
             for segment in self.segments[1:]:
                 old_tile_state = segment.get_tile_state()
                 segment.shift_tile(tile_state)
                 tile_state = old_tile_state
-                world.interact(segment)
 
         for segment in self.segments:
             segment.shift_pixels(ds)
+            world.interact(segment)
 
     def set_orientation(self, orientation):
         self.orientation = orientation
@@ -89,6 +88,16 @@
         self.make_images()
         self.update_image()
         self.set_tile_pos(tile_pos)
+        self.on_tiles = []
+
+    def filter_collisions(self, group):
+        collide = []
+        tiles = spritecollide(self, group, False)
+        for tile in tiles:
+            if tile not in self.on_tiles:
+                collide.append(tile)
+        self.on_tiles = tiles
+        return collide
 
     def set_base_image(self, image_name):
         self._base_image = "/".join(["snake", image_name])
--- a/mamba/world.py	Wed Sep 14 16:31:51 2011 +0200
+++ b/mamba/world.py	Wed Sep 14 17:41:26 2011 +0200
@@ -29,8 +29,8 @@
         self.snake.update(dt, self)
 
     def interact(self, segment):
-        tile = self.level.get_tile(segment.tile_pos)
-        if tile is not None and tile.alive:
+        tiles = segment.filter_collisions(self.level.sprites)
+        for tile in tiles:
             tile.interact(self.snake, segment)
 
     def restart(self):