Thorpy

"""Inspired by FluffyPotatoe's example on youtube, but improved blurry lights"""


import pygame, random
import thorpy as tp
from thorpy.graphics import generate_oscillating_lights as gen_lights

pygame.init()
W, H = 800,600
screen = pygame.display.set_mode((W, H))

#load some background pic for testing
bck = pygame.image.load(tp.fn("data/bck.jpg")) 
bck = pygame.transform.smoothscale(bck, (W,H))

#particles parameters
MAX_RADIUS = 10
RADIUS_FACTOR = 2
RADIUS_DECAY = MAX_RADIUS / 200
LIGHT_COLOR = (20, 20, 60)
N = RADIUS_FACTOR*MAX_RADIUS


def circle_transp_bck(radius, color):
    surf = pygame.Surface((radius * 2, radius * 2))
    pygame.draw.circle(surf, color, (radius, radius), radius)
    surf.set_colorkey((0, 0, 0))
    return surf

def draw_light_particle(particle):
    pygame.draw.circle(screen,
                        (255, 255, 255),
                        [int(particle[0][0]), int(particle[0][1])],
                        int(particle[2]))
    radius = particle[2] * RADIUS_FACTOR
    
    c = circle_transp_bck(radius, LIGHT_COLOR)
    r = c.get_rect()
    r.center = particle[0]
    #Fluffy Potatoe version: ############################################
    # screen.blit(c, r.topleft, special_flags=pygame.BLEND_RGB_ADD)
    #Thorpy version: ####################################################
    light = surfaces_light[int(radius)]
    rlight = light.get_rect()
    rlight.center = r.center
    screen.blit(light, rlight.topleft)

def generate_and_update_particles():
    #generate new particles
    particles.append([list(pygame.mouse.get_pos()), #pos
                      [1.3*(random.random()*2 - 1), -4], #vel
                      random.randint(MAX_RADIUS//2, MAX_RADIUS)]) #radius
    #update particles
    for particle in particles:
        particle[0][0] += particle[1][0] #update x
        particle[0][1] += particle[1][1] #update y
        particle[2] -= RADIUS_DECAY #reduce radius as time goes by
        particle[1][1] += 0.1 #gravity (update vy)
        draw_light_particle(particle)
        if particle[2] <= 0: #remove particle with negative or zero size
            particles.remove(particle)

#put lights in cache (can take some time)
surfaces_light = []
for i in range(N+1):
    img = circle_transp_bck(i, LIGHT_COLOR)
    img_light = gen_lights(img,
                           n=1, #number of frames
                           inflation=0,
                           radius_amplitude=3,
                           alpha_factor_base=0.9*i/N + 0.1,
                           alpha_factor_amplitude=0.,
                           color=(255,255,255)
                           )[0]
    surfaces_light.append(img_light)



particles = []
clock = pygame.time.Clock()
playing = True
while playing:
    screen.blit(bck, (0,0))
    generate_and_update_particles()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            playing = False
    ... #your stuff goes here
    pygame.display.flip()
    clock.tick(60)

pygame.quit()