Lighting Effects

From TRCCompSci - AQA Computer Science
Jump to: navigation, search

Intro

Many special effects can be achieved in PyGame, the easiest is a lighting effect which uses a radial gradient to control which parts of the screen can be seen. This could be used to position lights throughout your level instead of having a single light over the player. You could also change the shape of the gradient to alter the shape of the light (ie a down light).

Example

Have a look at this example:

import pygame
import sys
import os

screen=pygame.display.set_mode((640, 480))
light=pygame.image.load('circle.png') # radial gradient used for light pattern

player = pygame.image.load(os.path.join("hero.png")).convert_alpha(); # load in player image, convert_alpha will keep transparent background

player = pygame.transform.scale(player, (32, 50)) # resize player
light=pygame.transform.scale(light, (800,800)) # resize gradient

night = True # boolean to set if it is night or day

while True:
    for e in pygame.event.get():
        if e.type == pygame.QUIT: 
            pygame.quit()
            sys.exit()
            break

        if e.type == pygame.MOUSEBUTTONDOWN:
            night = not night # toggle night between true and false

    pos = []
    pos = pygame.mouse.get_pos() # get mouse position

    screen.fill(pygame.color.Color('Red')) # just a background
    for x in range(0, 640, 20):
        pygame.draw.line(screen, pygame.color.Color('Green'), (x, 0), (x, 480), 3)  # just lines on the background

    if night: # if light effect needed
        filter = pygame.surface.Surface((640, 480)) # create surface same size as window
        filter.fill(pygame.color.Color('Black')) # Black will give dark unlit areas, Grey will give you a fog
        filter.blit(light,(pos[0]-400,pos[1]-400)) # blit light to the filter surface -400 is to center effect
        screen.blit(filter, (0, 0), special_flags=pygame.BLEND_RGBA_MIN) # blit filter surface but with a blend

    screen.blit(player,pos) # blit the player over the effect
    pygame.display.flip()

It uses a radial gradient, this is my gradient:

Radial Gradient.png

It is used to light around the player. When the mouse button is pressed, night is toggled to switch between night and day.