Mercurial > scrounge
changeset 29:6563878f6ed1
exiting levels
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Tue, 23 Aug 2011 00:20:30 +0200 |
| parents | 0532cbb323bf |
| children | 61ca1f30fe84 |
| files | display.py hero.py level.py main.py |
| diffstat | 4 files changed, 64 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/display.py Mon Aug 22 23:44:48 2011 +0200 +++ b/display.py Tue Aug 23 00:20:30 2011 +0200 @@ -55,6 +55,9 @@ self.rect.move_ip(x * 24 - 4, y * 16 - 16) self.depth = self.rect.midbottom[1] + def move(self, x, y): + self.rect.topleft = (x * 24 - 4, y * 16 - 16) + self.depth = self.rect.midbottom[1] class Overlay(pygame.sprite.Sprite): def __init__(self, x, y, image): @@ -80,14 +83,22 @@ pygame.display.set_caption(caption) self.clock = pygame.time.Clock() self.screen = pygame.display.get_surface() - self.scroll_offset = (0, 0) - self.background = pygame.Surface(size) - self.background.fill((0, 0, 0)) self.sprites = SortedUpdates() self.shadows = pygame.sprite.Group() self.overlay = pygame.sprite.Group() self.effects = pygame.sprite.RenderUpdates() + self.empty() + + def empty(self): self.key = None + self.scroll_offset = (0, 0) + self.background = pygame.Surface((self.screen.get_width(), + self.screen.get_height())) + self.background.fill((0, 0, 0)) + self.sprites.empty() + self.shadows.empty() + self.overlay.empty() + self.effects.empty() def _sprite_clear(self, screen, rect): """Helper function for cleaning the sprites."""
--- a/hero.py Mon Aug 22 23:44:48 2011 +0200 +++ b/hero.py Tue Aug 23 00:20:30 2011 +0200 @@ -12,8 +12,8 @@ 1: { -1: 2, 0: 3, 1: 3}, } - def __init__(self, x, y): - super(HeroSprite, self).__init__(x, y, 'hero.png') + def __init__(self): + super(HeroSprite, self).__init__(0, 0, 'hero.png') self.facing = 2 self.animation = None @@ -44,14 +44,25 @@ self.image = self.frames[self.facing][frame % 4] yield - def anim_drop(self): + def anim_enter(self): self.depth = self.rect.midbottom[1] + 1 - self.image = self.frames[self.facing][0] + self.image = self.frames[2][0] self.rect.move_ip(0, -15) for step in range(6): yield self.rect.move_ip(0, step) + def anim_exit(self): + self.depth = self.rect.midbottom[1] + 1 + image = self.frames[2][0].copy() + self.image = image + move = 0 + for step in range(6): + yield + move += step + self.image = image.subsurface(0, 0, 32, 32 - move) + self.rect.move_ip(0, step) + def anim_fight(self, dx, dy): self.facing = self.faces[dx][dy] self.image = self.frames[self.facing][1] @@ -72,16 +83,26 @@ class Hero(thing.Thing): - def __init__(self, x=1, y=1): + def __init__(self, x=0, y=0): self.x, self.y = x, y self.effects = [] + self.sprite = HeroSprite() def render(self, to_display): - self.sprite = HeroSprite(self.x, self.y) - self.sprite.animation = self.sprite.anim_drop() to_display.sprites.add(self.sprite) to_display.sprites.add(thing.ShadowSprite(self.sprite)) + def enter(self, level, x, y): + self.x = x + self.y = y + self.sprite.move(x, y) + self.sprite.facing = 2 + self.sprite.animation = self.sprite.anim_enter() + + def exit(self, level): + self.sprite.animation = self.sprite.anim_exit() + level.hero = None + def walk(self, level, dx, dy): block = level.is_blocked(self.x + dx, self.y + dy) if not block:
--- a/level.py Mon Aug 22 23:44:48 2011 +0200 +++ b/level.py Tue Aug 23 00:20:30 2011 +0200 @@ -98,15 +98,15 @@ } BLOCKED = 1 - def __init__(self): - self.hero = None + def __init__(self, hero): + self.hero = hero gen = generator.LevelGenerator() self.map = gen.map self.things = {} for t in gen.things.itervalues(): self.things[(t.x, t.y)] = t - if isinstance(t, thing.Entrance) and self.hero is None: - self.hero = hero.Hero(t.x, t.y) + if isinstance(t, thing.Entrance): + self.hero.enter(self, t.x, t.y) self.monsters = {} for m in gen.monsters.itervalues(): self.monsters[(m.x, m.y)] = m
--- a/main.py Mon Aug 22 23:44:48 2011 +0200 +++ b/main.py Tue Aug 23 00:20:30 2011 +0200 @@ -5,33 +5,42 @@ import display import level +import hero class Game(object): def __init__(self): self.display = display.Display((320, 256)) - self.level = level.Level() + self.hero = hero.Hero() + self.start_level() + + def start_level(self): + self.display.empty() + self.level = level.Level(self.hero) self.level.render(self.display) - self.display.scroll_to(self.level.hero.sprite.rect) + self.display.scroll_to(self.hero.sprite.rect) def control(self): if self.display.key == pygame.locals.K_ESCAPE: raise display.GameQuit() - hero = self.level.hero end_turn = False - if not hero.sprite.animation: + if not self.hero.sprite.animation: + if self.level.hero is None: + self.start_level() + if self.level.map[self.hero.y][self.hero.x] == '>': + self.hero.exit(self.level) pressed = self.display.get_pressed() if pygame.locals.K_UP in pressed: - hero.walk(self.level, 0, -1) + self.hero.walk(self.level, 0, -1) end_turn = True elif pygame.locals.K_DOWN in pressed: - hero.walk(self.level, 0, 1) + self.hero.walk(self.level, 0, 1) end_turn = True elif pygame.locals.K_LEFT in pressed: - hero.walk(self.level, -1, 0) + self.hero.walk(self.level, -1, 0) end_turn = True elif pygame.locals.K_RIGHT in pressed: - hero.walk(self.level, 1, 0) + self.hero.walk(self.level, 1, 0) end_turn = True if end_turn: monsters = self.level.monsters.values() @@ -51,7 +60,7 @@ while True: self.display.tick(tick=20) self.control() - self.display.scroll_after(self.level.hero.sprite.rect) + self.display.scroll_after(self.hero.sprite.rect) except display.GameQuit: pass
