Mercurial > mhrok
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()
