diff skaapsteker/sprites/base.py @ 622:da331c80ec08

Clean up sprite inheritance hierarchy a bit.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 07 May 2011 13:42:27 +0200
parents 851c8726696c
children 65881746dc20
line wrap: on
line diff
--- a/skaapsteker/sprites/base.py	Fri May 06 17:54:24 2011 +0200
+++ b/skaapsteker/sprites/base.py	Sat May 07 13:42:27 2011 +0200
@@ -34,42 +34,43 @@
 class GameSprite(Sprite):
     image_dir = 'sprites/'
     image_file = None
+    sprite_layer = None
 
     def __init__(self, pos, **opts):
         Sprite.__init__(self)
-        self._starting_tile_pos = pos
+        if self.sprite_layer is not None:
+            # pygame's Sprite class clobbers self._layer in __init__(), so we need to thwart it.
+            self._layer = self.sprite_layer
+        self.setup_image_data(pos)
         self.setup(**opts)
-        self.setup_image_data(pos)
 
     def setup(self):
         pass
 
+    def get_tile_pos(self):
+        return cdiv(self.rect.center, TILE_SIZE)
+
     def setup_image_data(self, pos):
         self.image = data.load_image(self.image_dir + self.image_file)
         self.rect = self.image.get_rect(midbottom=tile_midbottom(pos))
         self.collide_rect = self.rect.move(0, 0)
 
 
-class AnimatedGameSprite(Sprite):
-    # folder for animation files, e.g. sprites/foo
-    image_dir = None
-
+class AnimatedGameSprite(GameSprite):
     # first item is the starting animation
-    animation_regexes = [
+    animation_regexes = (
         # TODO: swap back once we know how to swap
         ("running", r"^.*_\d+.png$"),
         ("standing", r"^.*_standing.png$"),
         ("attacking", r"^.*_attacking.png$"),
-    ]
+    )
 
     wants_updates = True
-
     frame_pause = 0.1  # default time between animation frames
+    facings = None
 
-    facings = {}
 
-    def __init__(self, pos, **opts):
-        Sprite.__init__(self)
+    def setup_image_data(self, pos):
         self._animations = dict((k, []) for k, r in self.animation_regexes)
         self._frame = 0
         self._last_time = 0
@@ -103,10 +104,7 @@
         else:
             self.collide_rect.midbottom = tile_midbottom(pos)
         self._update_image()
-        self.setup(**opts)
 
-    def setup(self):
-        pass
 
     def _update_image(self, force=False):
         if self.facing:
@@ -149,6 +147,7 @@
 
 class Monster(AnimatedGameSprite):
 
+    sprite_layer = Layers.PLAYER
     collision_layer = MONSTER_LAYER
     collides_with = set([PC_LAYER, PROJECTILE_LAYER])
 
@@ -156,13 +155,12 @@
 
     block = True
 
-    attack_frame = None  # Mark a spefici frame in the animatio n as when the attack lands
+    attack_frame = None  # Mark a speficic frame in the animation as when the attack lands
     attack_damage = 1
 
     def __init__(self, pos, **opts):
         AnimatedGameSprite.__init__(self, pos, **opts)
         self.floor_rect = Rect(self.collide_rect.topleft, (self.collide_rect.width, 2))
-        self._layer = Layers.PLAYER
         self.health = 10
         self._done_attack = False
         self.setup(**opts)
@@ -273,6 +271,7 @@
 
 class NPC(AnimatedGameSprite):
 
+    sprite_layer = Layers.PLAYER
     collision_layer = NPC_LAYER
     collides_with = set([])
 
@@ -283,10 +282,6 @@
     block = False
     actionable = True
 
-    def __init__(self, pos, **opts):
-        AnimatedGameSprite.__init__(self, pos, **opts)
-        self._layer = Layers.PLAYER
-
     def setup(self, name, world, dsm, state, facing=None):
         self.name = name
         self.world = world
@@ -375,14 +370,11 @@
     actionable = True
     liftable = True
 
+    sprite_layer = Layers.PLAYER
     collision_layer = NPC_LAYER
 
     debug_color = (240, 0, 240)
 
-    def __init__(self, pos, **opts):
-        GameSprite.__init__(self, pos, **opts)
-        self._layer = Layers.PLAYER
-
 
     def setup(self, name, world):
         self.name = name
@@ -484,16 +476,17 @@
     actionable = False
     liftable = False
     image_dir = 'sprites/skulls/'
+    sprite_layer = Layers.BEHIND
     debug_color = (255, 255, 0)
 
+
     def __init__(self, pos, player=False, **opts):
         self._pos = pos
         if player:
             self.image_file = 'kitsune.png'
         else:
             self.image_file = 'monster.png'
-        GameSprite.__init__(self, pos, **opts)
-        self._layer = Layers.BEHIND
+        super(Skeleton, self).__init__(pos, **opts)
 
     def setup_image_data(self, pos):
         GameSprite.setup_image_data(self, pos)