Mercurial > scrounge
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):
