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
Binary file blow/skeleton.png has changed