Rendering particles in realtime with py-lepton

Last Update: 24.09.2009. By azarai in game development | pyglet | python

Last time i made a small demo using prerendered particle effects. Today i’ll show another way of doing particle effects with python and pyglet. Instead of animating prerendered graphics i am going to use a particle system to create effects in realtime. The one i am using is [py-lepton] (http://code.google.com/p/py-lepton/ “link to py-lepton site”):

Lepton: A high-performance, pluggable particle engine and API for Python

Lepton is designed to make complex and beautiful particle effects possible, and even easy from Python programs.

Here is the demo of a simple explosion effect without using any premade texture. I made comments in the code that should explain everything.

The video:

Controls:

Left Mouse click : spawn new effect at center of the window

The Code:

from lepton import Particle , ParticleGroup , default_system from lepton.renderer import BillboardRenderer , PointRenderer from lepton.texturizer import SpriteTexturizer , create_point_texture from lepton.emitter import StaticEmitter from lepton.controller import Gravity , Lifetime , Movement , Fader , ColorBlender , Growth import pyglet from pyglet.gl import * #create pyglet window window = pyglet . window . Window ( visible = False ) window . clear () #enable alpha blending glEnable ( GL_BLEND ) glBlendFunc ( GL_SRC_ALPHA , GL_ONE ) def get_color ( r , g , b , a ): """ converts rgba values of 0 - 255 to the equivalent in 0 - 1""" return ( r / 255.0 , g / 255.0 , b / 255.0 , a / 255.0 ) # Setting up particle group for all explosion particles with some controllers # ColorBlending is from white to yellow to red/orange # For visuals us a Pointtexture generated by py-lepton explosion = ParticleGroup ( controllers = [ Lifetime ( 4 ), Movement ( damping = 0.93 ), Growth ( 30 ), Fader ( fade_in_start = 0 , start_alpha = 0 , fade_in_end = 0.5 , max_alpha = 0.4 , fade_out_start = 1 , fade_out_end = 4.0 ), ColorBlender ([( 0 , get_color ( 255 , 255 , 255 , 255 )), ( 0.75 , get_color ( 255 , 255 , 0 , 255 )), ( 1.5 , get_color ( 255 , 0 , 0 , 255 )) ]) ], renderer = PointRenderer ( 64 , SpriteTexturizer ( create_point_texture ( 64 , 5 )))) # The explosion emitter, the thing actually creating the particles # each particle starts at window center and add some variation (start position, size and # life time) explosion_emitter = StaticEmitter ( template = Particle ( position = ( window . width / 2 , window . height / 2 , 0 ), size = ( 20 , 20 , 0 ), ), deviation = Particle ( position = ( 1 , 1 , 0 ), size = ( 10 , 10 , 0 ), velocity = ( 100 , 100 , 0 ), age = 2 ), ) #if left mouse button is clicked a new explosion will be started @window.event def on_mouse_press ( x , y , button , modifiers ): if ( pyglet . window . mouse . LEFT == button ): explosion_emitter . emit ( 400 , explosion ) # clear screen and draw particles @window.event def on_draw (): window . clear () default_system . draw () # setup scheduler for particle updates and start pyglet if __name__ == '__main__' : window . set_visible ( True ) pyglet . clock . schedule_interval ( default_system . update , ( 1.0 / 30.0 )) pyglet . clock . set_fps_limit ( None ) pyglet . app . run ()

Now spice up the explosion without using any premade texture and share it.

Happy hacking :-)

Update 1: Fixed get_color method

Want content like this in your inbox each workday irregularly? No BS, spam or tricks... just useful content: