changeset 49:2b08885bf8ee

visibility of the map, with gradual appearing of new areas
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 28 Aug 2011 16:09:59 +0200
parents 006f9df7bf25
children e1bad2c34eae
files src/display.py src/level.py src/thing.py
diffstat 3 files changed, 62 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/display.py	Sun Aug 28 00:08:12 2011 +0200
+++ b/src/display.py	Sun Aug 28 16:09:59 2011 +0200
@@ -65,9 +65,38 @@
 class Overlay(pygame.sprite.Sprite):
     def __init__(self, x, y, image):
         super(Overlay, self).__init__()
-        self.image = image
+        self.image = image.subsurface((0, 0, 24, 16))
         self.rect = self.image.get_rect()
         self.rect.move_ip(x * 24, y * 16)
+        self.alpha = 0
+        self.image.set_alpha(0)
+
+    def update(self):
+        if self.alpha < 255:
+            self.alpha += 32
+            if self.alpha > 255:
+                self.alpha = 255
+            self.image.set_alpha(self.alpha)
+
+class Darkness(pygame.sprite.Sprite):
+    def __init__(self, x, y, w, h, holes=()):
+        super(Darkness, self).__init__()
+        self.image = pygame.surface.Surface((w * 24, h * 16))
+        self.image.fill((0, 0, 0))
+        self.image.set_colorkey((255, 255, 255))
+        self.rect = self.image.get_rect()
+        self.rect.move_ip(x * 24, y * 16)
+        self.alpha = 255
+        for x, y in holes:
+            self.image.fill((255, 255, 255), rect=pygame.rect.Rect(
+                        x * 24, y * 16, 24, 16))
+
+    def update(self):
+        self.alpha -= 32
+        if self.alpha < 0:
+            self.kill()
+            return
+        self.image.set_alpha(self.alpha)
 
 
 class SortedUpdates(pygame.sprite.RenderUpdates):
@@ -88,6 +117,7 @@
         self.sprites = SortedUpdates()
         self.shadows = pygame.sprite.Group()
         self.overlay = pygame.sprite.Group()
+        self.darkness = pygame.sprite.RenderUpdates()
         self.effects = pygame.sprite.RenderUpdates()
         self.menus = SortedUpdates()
         self.empty()
@@ -101,6 +131,7 @@
         self.sprites.empty()
         self.shadows.empty()
         self.overlay.empty()
+        self.darkness.empty()
         self.effects.empty()
 
     def _sprite_clear(self, screen, rect):
@@ -131,20 +162,24 @@
                 (-self.scroll_offset[0], -self.scroll_offset[1]),
                 (self.screen.get_width(), self.screen.get_height())))
         self.sprites.clear(self.screen, self._sprite_clear)
+        self.darkness.clear(self.screen, self._sprite_clear)
         self.effects.clear(self.screen, self._sprite_clear)
         self.menus.clear(self.screen, self._sprite_clear)
         self.shadows.update()
         self._sprite_shift(self.shadows, self.scroll_offset)
         self._sprite_shift(self.sprites, self.scroll_offset)
         self._sprite_shift(self.overlay, self.scroll_offset)
+        self._sprite_shift(self.darkness, self.scroll_offset)
         self._sprite_shift(self.effects, self.scroll_offset)
         self.shadows.draw(self.screen)
         self.sprites.draw(self.screen)
         self.overlay.draw(self.screen)
+        self.darkness.draw(self.screen)
         self.effects.draw(self.screen)
         self._sprite_shift(self.shadows, self.scroll_offset, reverse=True)
         self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
         self._sprite_shift(self.overlay, self.scroll_offset, reverse=True)
+        self._sprite_shift(self.darkness, self.scroll_offset, reverse=True)
         self._sprite_shift(self.effects, self.scroll_offset, reverse=True)
         self.menus.draw(self.screen)
         pygame.display.flip()
@@ -153,23 +188,29 @@
         """Update all the animated parts"""
 
         self.sprites.clear(self.screen, self._sprite_clear)
+        self.darkness.clear(self.screen, self._sprite_clear)
         self.effects.clear(self.screen, self._sprite_clear)
         self.menus.clear(self.screen, self._sprite_clear)
         self.sprites.update()
         self.effects.update()
+        self.overlay.update()
+        self.darkness.update()
         self.shadows.update()
         self.menus.update()
         self._sprite_shift(self.shadows, self.scroll_offset)
         self._sprite_shift(self.sprites, self.scroll_offset)
         self._sprite_shift(self.overlay, self.scroll_offset)
+        self._sprite_shift(self.darkness, self.scroll_offset)
         self._sprite_shift(self.effects, self.scroll_offset)
         self.shadows.draw(self.screen)
         dirty = self.sprites.draw(self.screen)
         self.overlay.draw(self.screen)
+        dirty += self.darkness.draw(self.screen)
         dirty += self.effects.draw(self.screen)
         self._sprite_shift(self.shadows, self.scroll_offset, reverse=True)
         self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
         self._sprite_shift(self.overlay, self.scroll_offset, reverse=True)
+        self._sprite_shift(self.darkness, self.scroll_offset, reverse=True)
         self._sprite_shift(self.effects, self.scroll_offset, reverse=True)
         dirty += self.menus.draw(self.screen)
         pygame.display.update(dirty)
--- a/src/level.py	Sun Aug 28 00:08:12 2011 +0200
+++ b/src/level.py	Sun Aug 28 16:09:59 2011 +0200
@@ -160,29 +160,36 @@
         area = (max(0, area[0] - 1), max(0, area[1] - 1),
                 min(len(self.map[0]), area[2] + 1),
                 min(len(self.map), area[3] + 1))
-        if (self.flags[area[1]][area[0]] & self.EXPLORED and
-            self.flags[area[1]][area[2]] & self.EXPLORED and
-            self.flags[area[3]][area[0]] & self.EXPLORED and
-            self.flags[area[3]][area[2]] & self.EXPLORED):
+        update = False
+        for y in range(area[1], area[3] + 1):
+            for x in range(area[0], area[2] + 1):
+                if not self.flags[y][x] & self.EXPLORED:
+                    update = True
+        if not update:
             return
+        self.render_map(display, area)
         for y in range(area[1], area[3] + 1):
             for x in range(area[0], area[2] + 1):
                 self.flags[y][x] |= self.EXPLORED
-        self.render_map(display, area)
-        display.redraw()
 
-    def render_map(self, display, area):
+    def render_map(self, to_display, area):
         if area is None:
             area = (0, 0, len(self.map[0]), len(self.map))
-        display.background.fill((0, 0, 0), rect=pygame.rect.Rect(area[0]*24,
+        to_display.background.fill((0, 0, 0), rect=pygame.rect.Rect(area[0]*24,
             area[1]*16, (area[2] - area[0]) * 24, (area[3] - area[1]) * 16))
+        holes = set()
         for y, line in enumerate(self.map[area[1]:area[3]]):
             for x, c in enumerate(line[area[0]:area[2]]):
                 tile_class = self.key.get(c)
                 if tile_class:
                     tile = tile_class(area[0] + x, area[1] + y, self.map)
-                    tile.render(display)
+                    tile.render(to_display)
                 try:
-                    self.things[(area[0] + x, area[1] + y)].render(display)
+                    self.things[(area[0] + x, area[1] + y)].render(to_display)
                 except KeyError:
                     pass
+                if self.flags[area[1] + y][area[0] + x] & self.EXPLORED:
+                    holes.add((x, y))
+        dark = display.Darkness(area[0], area[1], area[2] - area[0],
+                                area[3] - area[1], holes)
+        to_display.darkness.add(dark)
--- a/src/thing.py	Sun Aug 28 00:08:12 2011 +0200
+++ b/src/thing.py	Sun Aug 28 16:09:59 2011 +0200
@@ -52,8 +52,9 @@
                                      self.tx, self.ty)
 
     def render(self, to_display):
-        to_display.sprites.add(self.sprite)
-        to_display.shadows.add(ShadowSprite(self.sprite))
+        if self.sprite not in to_display.sprites:
+            to_display.sprites.add(self.sprite)
+            to_display.shadows.add(ShadowSprite(self.sprite))
 
 
 class Door(Thing):