changeset 7:edcfcb6a5132

Reorganize animations
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 28 Apr 2013 12:01:13 +0200
parents c4fd5827cb42
children 8dff86c114fb
files blow/beast.png blow/effects.png blow/game_scene.py blow/scene.py blow/sprite.py
diffstat 5 files changed, 57 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
Binary file blow/beast.png has changed
Binary file blow/effects.png has changed
--- a/blow/game_scene.py	Sun Apr 28 09:55:41 2013 +0200
+++ b/blow/game_scene.py	Sun Apr 28 12:01:13 2013 +0200
@@ -13,8 +13,8 @@
         super(SlowingSprite, self).__init__(*args, **kwargs)
         self.dx, self.dy = 0.0, 0.0
 
-    def update(self, tick):
-        super(SlowingSprite, self).update(tick)
+    def update(self, tick, scene):
+        super(SlowingSprite, self).update(tick, scene)
         self.dx = 0.95 * self.dx
         self.dy = 0.95 * self.dy
 
@@ -25,8 +25,8 @@
         self.dx, self.dy = 0, 0
         self.bounce = False
 
-    def update(self, tick):
-        super(FallingSprite, self).update(tick)
+    def update(self, tick, scene):
+        super(FallingSprite, self).update(tick, scene)
         dy = min(self.dy, BOTTOM - self.rect.bottom)
         self.rect.move_ip(self.dx, dy)
         if not self.on_ground():
@@ -41,8 +41,8 @@
 
 
 class JumpingSprite(FallingSprite):
-    def update(self, tick):
-        super(JumpingSprite, self).update(tick)
+    def update(self, tick, scene):
+        super(JumpingSprite, self).update(tick, scene)
         if self.on_ground() and self.can_jump():
             self.dy = -4
 
@@ -55,14 +55,41 @@
         super(TreeSprite, self).__init__(*args, **kwargs)
         self.depth = -1
 
+    def update(self, tick, scene):
+        super(TreeSprite, self).update(tick, scene)
+        if self.rect.right < 0:
+            self.rect.left = 768
+        elif self.rect.left > 768:
+            self.rect.right = 0
+
 
 class HeroSprite(JumpingSprite, Sprite):
     def __init__(self, *args, **kwargs):
         super(HeroSprite, self).__init__(*args, **kwargs)
         self.depth = 3
+        self.sword = None
 
-    def update(self, tick):
-        super(HeroSprite, self).update(tick)
+    def update(self, tick, scene):
+        super(HeroSprite, self).update(tick, scene)
+        if self.sword is None:
+            self.sword = SwordSprite(self, scene.resources.weapons)
+            scene.sprites.add(self.sword)
+        keys = pygame.key.get_pressed()
+        if keys[pygame.K_LEFT]:
+            self.rect.move_ip(-6, 0)
+            for sprite in scene.sprites:
+                sprite.rect.move_ip(6, 0)
+        elif keys[pygame.K_RIGHT]:
+            self.rect.move_ip(6, 0)
+            for sprite in scene.sprites:
+                sprite.rect.move_ip(-6, 0)
+        if keys[pygame.K_UP]:
+            if self.can_jump():
+                self.dy = -16
+        if keys[pygame.K_SPACE]:
+            if self.sword.animation is None:
+                self.sword.animation = self.sword.swing_animation(scene)
+                self.dy = -2
 
 
 class SkeletonSprite(JumpingSprite, SlowingSprite, Sprite):
@@ -72,8 +99,8 @@
         self.depth = 1
         self.stun = False
 
-    def update(self, tick):
-        super(SkeletonSprite, self).update(tick)
+    def update(self, tick, scene):
+        super(SkeletonSprite, self).update(tick, scene)
         if self.can_jump() and not self.stun:
             if self.rect.left < 0:
                 self.wx = 4
@@ -102,15 +129,19 @@
         self.depth = 5
         self.sx, self.sy = 0, 0
 
-    def update(self, tick):
-        super(SwordSprite, self).update(tick)
+    def update(self, tick, scene):
+        super(SwordSprite, self).update(tick, scene)
         x, y = self.owner.rect.midleft
         self.rect.center = x + self.sx, y + self.sy
 
-    def swing_animation(self):
+    def swing_animation(self, scene):
+        scene.resources.swoosh.play()
         self.image = self.frames[2]
         self.sx, self.sy = 64, 0
         yield
+        swoosh = SwooshSprite(scene.resources.effects)
+        swoosh.rect.midtop = self.owner.rect.topright
+        scene.sprites.add(swoosh)
         yield
         self.image = self.frames[3]
         self.sx, self.sy = 64, 14
@@ -143,6 +174,15 @@
             yield
         self.kill()
 
+    def update(self, tick, scene):
+        super(SwooshSprite, self).update(tick, scene)
+        monster = pygame.sprite.spritecollideany(
+            self, scene.monsters, pygame.sprite.collide_mask)
+        if monster and monster.animation is None:
+            monster.animation = monster.stun_animation()
+            monster.dx = 12
+            monster.dy = -8
+
 
 class GameScene(Scene):
     def __init__(self, display, resources):
@@ -150,9 +190,8 @@
         self.monsters = pygame.sprite.Group()
         self.background.fill((0xf0, 0xf0, 0xf0))
         self.hero = HeroSprite(self.resources.hero)
+        self.hero.rect.midbottom = (128, BOTTOM)
         self.sprites.add(self.hero)
-        self.sword = SwordSprite(self.hero, self.resources.weapons)
-        self.sprites.add(self.sword)
 
         skeleton = SkeletonSprite(self.resources.skeleton)
         skeleton.stun_sound = self.resources.hit
@@ -172,26 +211,4 @@
 
     def update(self, *args, **kwargs):
         super(GameScene, self).update(*args, **kwargs)
-        keys = pygame.key.get_pressed()
-        if keys[pygame.K_LEFT]:
-            self.hero.rect.move_ip(-6, 0)
-        elif keys[pygame.K_RIGHT]:
-            self.hero.rect.move_ip(6, 0)
-        if keys[pygame.K_UP]:
-            if self.hero.can_jump():
-                self.hero.dy = -16
-        if keys[pygame.K_SPACE]:
-            if self.sword.animation is None:
-                self.resources.swoosh.play()
-                self.sword.animation = self.sword.swing_animation()
-                self.hero.dy = -2
-                swoosh = SwooshSprite(self.resources.effects)
-                swoosh.rect.midtop = self.hero.rect.topright
-                self.sprites.add(swoosh)
-                monster = pygame.sprite.spritecollideany(
-                    swoosh, self.monsters, pygame.sprite.collide_mask)
-                if monster:
-                    monster.animation = monster.stun_animation()
-                    monster.dx = 12
-                    monster.dy = -8
 
--- a/blow/scene.py	Sun Apr 28 09:55:41 2013 +0200
+++ b/blow/scene.py	Sun Apr 28 12:01:13 2013 +0200
@@ -12,6 +12,6 @@
 
     def update(self, first=False):
         tick = self.display.update(self.background, self.sprites, first)
-        self.sprites.update(tick)
+        self.sprites.update(tick, self)
 
 
--- a/blow/sprite.py	Sun Apr 28 09:55:41 2013 +0200
+++ b/blow/sprite.py	Sun Apr 28 12:01:13 2013 +0200
@@ -20,8 +20,8 @@
             self.rect.midbottom = pos
         self.animation = None
 
-    def update(self, tick):
-        super(Sprite, self).update(tick)
+    def update(self, tick, scene):
+        super(Sprite, self).update(tick, scene)
         if self.animation:
             try:
                 self.animation.next()