Mercurial > blow
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)) +
--- /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 +
