diff skaapsteker/sprites/player.py @ 149:5b4d73d301a1

Don't change image if it will introduce new collisions
author Neil Muller <drnlmuller@gmail.com>
date Tue, 05 Apr 2011 17:35:14 +0200
parents 0474df61d5b1
children 06be025c821c
line wrap: on
line diff
--- a/skaapsteker/sprites/player.py	Tue Apr 05 17:13:32 2011 +0200
+++ b/skaapsteker/sprites/player.py	Tue Apr 05 17:35:14 2011 +0200
@@ -21,6 +21,7 @@
         self.rect = None
         self._image_dict = {}
         self._animation_frame = 0.0
+        self._recent_collisions = []
         # State flags and such
         self.running = False
         self.jumping = False
@@ -42,9 +43,16 @@
             cur_pos = self.collide_rect.bottomleft
         else:
             cur_pos = (0, 0)
+        cand_image = images[int(self._animation_frame)]
+        cand_collide_rect = cand_image.get_bounding_rect(1)
+        cand_collide_rect.bottomleft = cur_pos
+        if cand_collide_rect.collidelist(self._recent_collisions) != -1 \
+                and self.collide_rect.collidelist(self._recent_collisions) == -1:
+            # We introduce a new collision, so don't update the image
+            return
         self.image = images[int(self._animation_frame)]
+        self.collide_rect = self.image.get_bounding_rect(1)
         self.rect = self.image.get_rect()
-        self.collide_rect = self.image.get_bounding_rect(1)
         self.rect_offset = self.rect.left - self.collide_rect.left, self.rect.bottom - self.collide_rect.bottom
         self.collide_rect.bottomleft = cur_pos
         self.rect.bottomleft = cur_pos[0] + self.rect_offset[0], cur_pos[1] + self.rect_offset[1]
@@ -64,6 +72,10 @@
     def set_facing(self, new_facing):
         self.facing = new_facing
 
+    def collided(self, other):
+        self._recent_collisions.append(other.collide_rect)
+        while len(self._recent_collisions) > 10:
+            self._recent_collisions.pop(0)
 
     def set_pos(self, pos):
         self.starting_tile_pos = pos