Title: Screen dimmer class
Author: Tobias Thelen (tthelen at uni-osnabrueck.de)
Description: A class for 'dimming' (i.e. darkening) the entire screen
pygame version required: Any
Comments: Comments: This class is useful for a variety of effects in any non-palettized screen mode. Consider using a quick flash to white with explosion effects, or a doom-like flash to red when the player is injured. Mr. Thelen has included an undim function, so you don't need to manually save and restore your screen after the fade.
""" Dimmer class Tobias Thelen (email@example.com) 6 September 2001 PUBLIC DOMAIN Use it in any way you want... tested with: Pyton 2.0/pygame-1.1, Windows 98 A class for 'dimming' (i.e. darkening) the entire screen, useful for: - indicating a 'paused' state - drawing user's attention away from background to e.g. a Quit/Don't Quit dialog or a highscore list or... Usage: dim=Dimmer(keepalive=1) Creates a new Dimmer object, if keepalive is true, the object uses the same surface over and over again, blocking some memory, but that makes multiple undim() calls possible - Dimmer can be 'abused' as a memory for screen contents this way.. dim.dim(darken_factor=64, color_filter=(0,0,0)) Saves the current screen for later restorage and lays a filter over it - the default color_filter value (black) darkens the screen by blitting a black surface with alpha=darken_factor over it. By using a different color, special effects are possible, darken_factor=0 just stores the screen and leaves it unchanged dim.undim() restores the screen as it was visible before the last dim() call. If the object has been initialised with keepalive=0, this only works once. """ import pygame class Dimmer: def __init__(self, keepalive=0): self.keepalive=keepalive if self.keepalive: self.buffer=pygame.Surface(pygame.display.get_surface().get_size()) else: self.buffer=None def dim(self, darken_factor=64, color_filter=(0,0,0)): if not self.keepalive: self.buffer=pygame.Surface(pygame.display.get_surface().get_size()) self.buffer.blit(pygame.display.get_surface(),(0,0)) if darken_factor>0: darken=pygame.Surface(pygame.display.get_surface().get_size()) darken.fill(color_filter) darken.set_alpha(darken_factor) # safe old clipping rectangle... old_clip=pygame.display.get_surface().get_clip() # ..blit over entire screen... pygame.display.get_surface().blit(darken,(0,0)) pygame.display.flip() # ... and restore clipping pygame.display.get_surface().set_clip(old_clip) def undim(self): if self.buffer: pygame.display.get_surface().blit(self.buffer,(0,0)) pygame.display.flip() if not self.keepalive: self.buffer=None