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