changeset 24:039121bf8148

Vary the light radius
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Tue, 06 Mar 2012 22:39:49 +0100
parents 24ae69443e4b
children 5aca833e2031
files mhrok.py
diffstat 1 files changed, 40 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/mhrok.py	Tue Mar 06 22:05:45 2012 +0100
+++ b/mhrok.py	Tue Mar 06 22:39:49 2012 +0100
@@ -25,22 +25,39 @@
         self.rect.center = self.owner.rect.center
 
 class Vision(pygame.sprite.DirtySprite):
-    def __init__(self, owner, level):
+    def __init__(self, owner, radius):
         super(Vision, self).__init__()
         self.owner = owner
-        self.level = level
-        self.image = pygame.Surface((120, 90), pg.SRCALPHA)
-        self.rect = self.image.get_rect()
-        self.image.fill((255, 255, 255, 255))
-        for r in xrange(45, 19, -1):
-            pygame.draw.ellipse(
-                    self.image,
-                    (255, 255, 255, min(255, (r-19) * 10)),
-                    (60-r*5/4, 45-r, 2*r*5/4, 2*r), 0)
         self.blendmode = pg.BLEND_RGBA_MIN
         self.dirty = 2
+        self.images = {}
+        for r in xrange(40, 65):
+            self.images[r] = self.get_image(r)
+        self.radius = radius
+        self.set_radius(radius)
+
+    def set_radius(self, radius):
+        self.current_radius = radius
+        self.image = self.images[radius]
+        self.rect = self.image.get_rect()
+        self.rect.center = self.owner.rect.center
+
+
+    def get_image(self, radius):
+        image = pygame.Surface((radius*5/2, radius*2), pg.SRCALPHA)
+        image.fill((255, 255, 255, 255))
+        for r in xrange(radius, radius-25, -1):
+            pygame.draw.ellipse(
+                    image,
+                    (255, 255, 255, max(0, min(255, (r-radius+25) * 10))),
+                    (radius*5/4-r*5/4, radius-r, 2*r*5/4, 2*r), 0)
+        return image
 
     def update(self):
+        if self.current_radius > self.radius:
+            self.set_radius(max(self.current_radius - 4, self.radius))
+        elif self.current_radius < self.radius:
+            self.set_radius(min(self.current_radius + 4, self.radius))
         self.rect.center = self.owner.rect.center
 
 
@@ -301,8 +318,9 @@
     def render_level(self, level):
         self.sprites, self.shadows, pcmob = level.render_sprites(self.tiles)
         self.background.blit(level.render_background(self.tiles), (0, 0))
-        self.vision = pygame.sprite.LayeredDirty()
-        self.vision.add(Vision(pcmob, level))
+        self.visions = pygame.sprite.LayeredDirty()
+        self.vision = Vision(pcmob, 64)
+        self.visions.add(self.vision)
 
     def light_room(self, room):
         (rx, ry), (rw, rh) = room
@@ -321,17 +339,17 @@
             self.screen.blit(self.background, (0, 0))
             self.shadows.draw(self.screen)
             self.sprites.draw(self.screen)
-            self.vision.draw(self.fog)
+            self.visions.draw(self.fog)
             self.screen.blit(self.fog, (0, 0))
             self.dirty = [self.background.get_rect()]
             self.first_draw = False
         else:
             self.screen.blit(self.background, (0, 0))
-            self.vision.clear(self.fog, self.memory)
+            self.visions.clear(self.fog, self.memory)
             self.sprites.clear(self.screen, self.background)
             self.shadows.draw(self.screen)
             self.dirty.extend(self.sprites.draw(self.screen))
-            self.dirty.extend(self.vision.draw(self.fog))
+            self.dirty.extend(self.visions.draw(self.fog))
             self.screen.blit(self.fog, (0, 0))
         pygame.display.update(self.dirty)
         self.dirty = []
@@ -357,9 +375,13 @@
             self.pc.control(self.level)
             mx, my = self.pc.mob.rect.topleft
             room = self.level.find_room((mx+1)/20, (my+6)/12)
-            if room and room not in self.level.lit_rooms:
-                self.level.lit_rooms.append(room)
-                self.display.light_room(room)
+            if room:
+                self.display.vision.radius = 64
+                if room not in self.level.lit_rooms:
+                    self.level.lit_rooms.append(room)
+                    self.display.light_room(room)
+            else:
+                self.display.vision.radius = 40
             self.display.draw()
             self.clock.tick(15)
             self.display.update()