changeset 16:1053363c0f22

Add simple fog of war
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Wed, 29 Feb 2012 22:12:09 +0100
parents 2fd709e21c45
children c0b56a4b73d5
files mhrok.py
diffstat 1 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mhrok.py	Wed Feb 29 21:52:19 2012 +0100
+++ b/mhrok.py	Wed Feb 29 22:12:09 2012 +0100
@@ -266,23 +266,36 @@
         self.first_draw = True
         self.tiles = load_tiles('mhrok.png', 32, 32)
         self.background = pygame.Surface(self.screen.get_size())
+        self.fog = pygame.Surface(self.screen.get_size(), pg.SRCALPHA)
+        self.fog.fill((0, 0, 0))
+        self.fov = pygame.Surface((64, 64), pg.SRCALPHA)
+        pygame.draw.circle(self.fov, (255, 255, 255), (32, 32), 32, 0)
+        self.dirty = []
 
     def render_level(self, level):
         self.sprites, self.shadows = level.render_sprites(self.tiles)
         self.background.blit(level.render_background(self.tiles), (0, 0))
 
+    def light(self, (x, y)):
+        dirty = self.fog.blit(self.fov, (x-32, y-32),
+                              special_flags=pg.BLEND_RGBA_SUB)
+        self.dirty.append(dirty)
+
     def draw(self):
         if self.first_draw:
             self.screen.blit(self.background, (0, 0))
             self.shadows.draw(self.screen)
             self.sprites.draw(self.screen)
             self.first_draw = False
-            dirty = self.background.get_rect()
+            self.screen.blit(self.fog, (0, 0))
+            self.dirty = [self.background.get_rect()]
         else:
             self.sprites.clear(self.screen, self.background)
             self.shadows.draw(self.screen)
-            dirty = self.sprites.draw(self.screen)
-        pygame.display.update(dirty)
+            self.dirty.extend(self.sprites.draw(self.screen))
+            self.screen.blit(self.fog, (0, 0))
+        pygame.display.update(self.dirty)
+        self.dirty = []
 
     def update(self):
         self.sprites.update()
@@ -302,6 +315,7 @@
     def main(self):
         while not self.game_over:
             self.pc.control(self.level)
+            self.display.light(self.pc.mob.rect.center)
             self.display.draw()
             self.clock.tick(15)
             self.display.update()