Mercurial > skaapsteker
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)