changeset 2:f701c97a27ba

Basic jumping hero
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 27 Apr 2013 15:22:41 +0200
parents 65933bee61ee
children 800c444c6a11
files blow/display.py blow/game.py blow/game_scene.py blow/hero.png blow/scene.py blow/sprite.py
diffstat 6 files changed, 100 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/blow/display.py	Sat Apr 27 13:41:42 2013 +0200
+++ b/blow/display.py	Sat Apr 27 15:22:41 2013 +0200
@@ -3,35 +3,24 @@
 import pygame
 
 
-class SortedUpdates(pygame.sprite.RenderUpdates):
-    def sprites(self):
-        return sorted(self.spritedict.keys(),
-                      key=lambda s: s.rect.bottom + getattr(s, 'depth', 0))
-
-
-
 class Display(object):
     def __init__(self):
-        self.width = 480
+        self.width = 768
         self.height = 480
         self.screen = pygame.display.set_mode((self.width, self.height))
-        self.background = self.screen.copy()
         self.clock = pygame.time.Clock()
-        self.sprites = SortedUpdates()
 
-    def update(self, whole_screen=False):
+    def update(self, background, sprites, whole_screen=False):
         if whole_screen:
-            self.screen.blit(self.background, (0, 0))
-            self.sprites.update()
-            self.sprites.draw(self.screen)
+            self.screen.blit(background, (0, 0))
+            sprites.draw(self.screen)
             pygame.display.update()
         else:
-            self.sprites.clear(self.screen, self.background)
-            self.sprites.update()
-            dirty = self.sprites.draw(self.screen)
+            sprites.clear(self.screen, background)
+            dirty = sprites.draw(self.screen)
             pygame.display.update(dirty)
         for event in pygame.event.get():
             if event.type == pygame.QUIT:
                 raise SystemExit()
-        self.clock.tick(24)
+        return self.clock.tick(24)
 
--- a/blow/game.py	Sat Apr 27 13:41:42 2013 +0200
+++ b/blow/game.py	Sat Apr 27 15:22:41 2013 +0200
@@ -1,18 +1,21 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
 from blow.display import Display
 from blow.resources import Resources
-
+from blow.game_scene import GameScene
 
 class Game(object):
     def __init__(self):
         self.display = Display()
         self.resources = Resources()
         self.game_over = False
+        self.scenes = []
 
     def run(self):
-        self.display.update(whole_screen=True)
-        while not self.game_over:
-            self.display.update()
+        self.scenes.append(
+            GameScene(self.display, self.resources)
+        )
+        self.scenes[-1].update(True)
+        while self.scenes:
+            self.scenes[-1].update()
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/blow/game_scene.py	Sat Apr 27 15:22:41 2013 +0200
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+
+from blow.sprite import Sprite
+from blow.scene import Scene
+
+
+BOTTOM = 420
+
+
+class GravitySprite(object):
+    def __init__(self, *args, **kwargs):
+        super(GravitySprite, self).__init__(*args, **kwargs)
+        self.dx, self.dy = 0, 0
+
+    def update(self, tick):
+        super(GravitySprite, self).update(tick)
+        self.dy = min(self.dy, BOTTOM - self.rect.bottom)
+        self.rect.move_ip(self.dx, self.dy)
+        if self.rect.bottom < BOTTOM:
+            self.dy += 1
+
+
+class JumpingSprite(object):
+    def update(self, tick):
+        super(JumpingSprite, self).update(tick)
+        if self.rect.bottom >= BOTTOM:
+            self.dy = -4
+
+class HeroSprite(GravitySprite, JumpingSprite, Sprite):
+    pass
+
+
+class GameScene(Scene):
+    def __init__(self, display, resources):
+        super(GameScene, self).__init__(display, resources)
+        self.background.fill((0xff, 0xff, 0xff))
+        self.sprites.add(HeroSprite(self.resources.hero))
+
Binary file blow/hero.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/blow/scene.py	Sat Apr 27 15:22:41 2013 +0200
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+from blow.sprite import SortedUpdates
+
+
+class Scene(object):
+    def __init__(self, display, resources):
+        self.display = display
+        self.resources = resources
+        self.sprites = SortedUpdates()
+        self.background = self.display.screen.copy()
+
+    def update(self, first=False):
+        tick = self.display.update(self.background, self.sprites, first)
+        self.sprites.update(tick)
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/blow/sprite.py	Sat Apr 27 15:22:41 2013 +0200
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+
+import pygame
+
+
+class SortedUpdates(pygame.sprite.RenderUpdates):
+    def sprites(self):
+        return sorted(self.spritedict.keys(),
+                      key=lambda s: s.rect.bottom + getattr(s, 'depth', 0))
+
+
+class Sprite(pygame.sprite.Sprite):
+    def __init__(self, frames, frame=0, pos=None):
+        super(Sprite, self).__init__()
+        self.frames = frames
+        self.frame = frame
+        self.image = frames[frame]
+        self.rect = self.image.get_rect()
+        if pos is not None:
+            self.rect.midbottom = pos
+        self.animation = None
+
+    def update(self, tick):
+        super(Sprite, self).update(tick)
+        if self.animation:
+            try:
+                self.animation.next()
+            except StopIteration:
+                self.animation = None
+