Mercurial > blow
changeset 5:359046dd78bb
Make the skeleton bounce
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sat, 27 Apr 2013 21:50:08 +0200 |
| parents | a6a9f884fb4a |
| children | c4fd5827cb42 |
| files | blow/game_scene.py blow/skeleton.png |
| diffstat | 2 files changed, 50 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/blow/game_scene.py Sat Apr 27 21:12:36 2013 +0200 +++ b/blow/game_scene.py Sat Apr 27 21:50:08 2013 +0200 @@ -8,18 +8,33 @@ BOTTOM = 420 +class SlowingSprite(object): + def __init__(self, *args, **kwargs): + super(SlowingSprite, self).__init__(*args, **kwargs) + self.dx, self.dy = 0.0, 0.0 + + def update(self, tick): + super(SlowingSprite, self).update(tick) + self.dx = 0.95 * self.dx + self.dy = 0.95 * self.dy + class FallingSprite(object): def __init__(self, *args, **kwargs): super(FallingSprite, self).__init__(*args, **kwargs) self.dx, self.dy = 0, 0 + self.bounce = False def update(self, tick): super(FallingSprite, self).update(tick) - self.dy = min(self.dy, BOTTOM - self.rect.bottom) - self.rect.move_ip(self.dx, self.dy) + dy = min(self.dy, BOTTOM - self.rect.bottom) + self.rect.move_ip(self.dx, dy) if not self.on_ground(): self.dy += 1 + elif self.bounce: + self.dy = -self.dy + else: + self.dy = 0 def on_ground(self): return self.rect.bottom >= BOTTOM @@ -28,9 +43,12 @@ class JumpingSprite(FallingSprite): def update(self, tick): super(JumpingSprite, self).update(tick) - if self.on_ground(): + if self.on_ground() and self.can_jump(): self.dy = -4 + def can_jump(self): + return self.dy >= -4 and self.rect.bottom >= BOTTOM - 8 + class HeroSprite(JumpingSprite, Sprite): def __init__(self, *args, **kwargs): @@ -40,22 +58,33 @@ def update(self, tick): super(HeroSprite, self).update(tick) - def can_jump(self): - return self.dy >= -4 and self.rect.bottom >= BOTTOM - 8 - -class SkeletonSprite(JumpingSprite, Sprite): +class SkeletonSprite(JumpingSprite, SlowingSprite, Sprite): def __init__(self, *args, **kwargs): - super(FallingSprite, self).__init__(*args, **kwargs) - self.dx, self.dy = -4, 0 + super(SkeletonSprite, self).__init__(*args, **kwargs) + self.wx, self.wy = -4, 0 self.depth = 1 + self.stun = False def update(self, tick): super(SkeletonSprite, self).update(tick) - if self.rect.left < 0: - self.dx = 4 - elif self.rect.right > 780: - self.dx = -4 + if self.can_jump() and not self.stun: + if self.rect.left < 0: + self.wx = 4 + elif self.rect.right > 780: + self.wx = -4 + self.rect.move_ip(self.wx, self.wy) + + def stun_animation(self): + self.image = self.frames[1] + self.bounce = True + self.stun = True + for i in xrange(30): + yield + self.image = self.frames[0] + self.bounce = False + self.stun = False + class SwordSprite(Sprite): def __init__(self, owner, *args, **kwargs): @@ -106,14 +135,14 @@ class GameScene(Scene): def __init__(self, display, resources): super(GameScene, self).__init__(display, resources) - self.background.fill((0xfe, 0xfd, 0xff)) + self.background.fill((0xf0, 0xf0, 0xf0)) self.hero = HeroSprite(self.resources.hero) self.sprites.add(self.hero) self.sword = SwordSprite(self.hero, self.resources.weapons) self.sprites.add(self.sword) - skeleton = SkeletonSprite(self.resources.skeleton) - skeleton.rect.move_ip(716, 0) - self.sprites.add(skeleton) + self.skeleton = SkeletonSprite(self.resources.skeleton) + self.skeleton.rect.move_ip(716, 0) + self.sprites.add(self.skeleton) def update(self, *args, **kwargs): super(GameScene, self).update(*args, **kwargs) @@ -132,3 +161,7 @@ swoosh = SwooshSprite(self.resources.effects) swoosh.rect.midtop = self.hero.rect.topright self.sprites.add(swoosh) + if pygame.sprite.collide_mask(swoosh, self.skeleton): + self.skeleton.animation = self.skeleton.stun_animation() + self.skeleton.dx = 12 + self.skeleton.dy = -8
