Create incredible particle effects with Partigen 2

Do you remember Partigen?

Andrew Fitzgerald from Desuade released the new version, of his amazing particle effects engine: Partigen 2.

Featuring over 120 exclusive preset effects, Partigen 2 is the first and only extension for Flash that let’s you to create complex particle effects in just a click.

The list of features is huge, so I am listing the ones I found most interesting:

  • Full Package XML-Serialization
  • Fully documented AS3 API
  • Emitters can be created with either the IDE component or via ActionScript
  • Particles can be any display object that inherits the Particle class
  • Renderers can be shared across multiple Emitters
  • Pools can handle the internal creation and storage of Particle objects in memory

You can read the full list of features here

The documentation is awesome, the best I’ve seen so far in a product like this one. You can access the full API documentation, and from this link you can access a 42 minutes long video covering the entire Partigen 2 component, and you can create beautiful effects using the component in less than a minute.

Anyway, we’re not here to talk about the component, but to test the AS3 API.

Playing with AS3 API

In this example, I am going to create a particle effect with the user interface provided in the component, then I’ll export it with XML and finally add it “on the fly” to the Box2D car example.

Playing with the presets is easy and fun, and once you’re done, just press “Copy to XML” to have the XML copied into your dashboard

Then, since we don’t want external files in our game, this is the code we need:

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	//
	import Box2D.Dynamics.*;
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
	import Box2D.Dynamics.Joints.*;
	// partigen libraries
	import com.desuade.partigen.emitters.*;
	import com.desuade.partigen.renderers.*;
	public class partigen extends Sprite {
		public var world:b2World;
		public var car_body:b2Body;
		public var front_wheel:b2Body;
		public var rear_wheel:b2Body;
		public var front_motor:b2RevoluteJointDef = new b2RevoluteJointDef();
		public var rear_motor:b2RevoluteJointDef = new b2RevoluteJointDef();
		public var fixtureDef:b2FixtureDef = new b2FixtureDef();
		public var rear_motor_added:b2RevoluteJoint;
		public var front_motor_added:b2RevoluteJoint;
		// partigen variables
		public var the_particle:particle_mc = new particle_mc();
		var particle_emitter:Emitter = new Emitter();
		public function partigen() {
			world=new b2World(new b2Vec2(0,10.0),true);
			debug_draw();
			var body:b2Body;
			var bodyDef:b2BodyDef= new b2BodyDef();
			var boxDef:b2PolygonShape = new b2PolygonShape();
			var circleDef:b2CircleShape=new b2CircleShape(20/30);
			var revoluteJointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
			bodyDef.position.Set(250/30, 200/30);
			boxDef.SetAsBox(600/30, 20/30);
			fixtureDef.shape=boxDef;
			fixtureDef.friction=1;
			fixtureDef.density=1;
			body=world.CreateBody(bodyDef);
			body.CreateFixture(fixtureDef);
			bodyDef.position.Set(0/30, 200/30);
			boxDef.SetAsBox(50/30, 50/30);
			fixtureDef.shape=boxDef;
			fixtureDef.friction=1;
			fixtureDef.density=1;
			body=world.CreateBody(bodyDef);
			body.CreateFixture(fixtureDef);
			bodyDef.position.Set(500/30, 200/30);
			boxDef.SetAsBox(50/30, 50/30);
			fixtureDef.shape=boxDef;
			fixtureDef.friction=1;
			fixtureDef.density=1;
			body=world.CreateBody(bodyDef);
			body.CreateFixture(fixtureDef);
			bodyDef.position.Set(250/30, 90/30);
			bodyDef.type=b2Body.b2_dynamicBody;
			bodyDef.userData = new Sprite();
			boxDef.SetAsBox(50/30, 10/30);
			fixtureDef.shape=boxDef;
			fixtureDef.density=1;
			fixtureDef.friction=1;
			fixtureDef.restitution=0.1;
			car_body=world.CreateBody(bodyDef);
			car_body.CreateFixture(fixtureDef);
			fixtureDef.density=1;
			fixtureDef.friction=5;
			fixtureDef.density=0.1;
			fixtureDef.shape=circleDef;
			bodyDef.allowSleep=false;
			bodyDef.position.Set(car_body.GetWorldCenter().x + 40/30, car_body.GetWorldCenter().y);
			front_wheel=world.CreateBody(bodyDef);
			front_wheel.CreateFixture(fixtureDef);
			bodyDef.position.Set(car_body.GetWorldCenter().x - 40/30, car_body.GetWorldCenter().y);
			rear_wheel=world.CreateBody(bodyDef);
			rear_wheel.CreateFixture(fixtureDef);
			front_motor.enableMotor=true;
			front_motor.maxMotorTorque=10;
			front_motor.Initialize(car_body, front_wheel, front_wheel.GetWorldCenter());
			front_motor_added=world.CreateJoint(front_motor) as b2RevoluteJoint;
			rear_motor.enableMotor=true;
			rear_motor.maxMotorTorque=1;
			rear_motor.Initialize(car_body, rear_wheel, rear_wheel.GetWorldCenter());
			rear_motor_added=world.CreateJoint(rear_motor) as b2RevoluteJoint;
			addEventListener(Event.ENTER_FRAME, update);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
			// partigen code
			var particle_container:Sprite = new Sprite();
			addChild(particle_container);
			var particle_renderer:Renderer=new StandardRenderer(particle_container,'top');
			particle_emitter.renderer=particle_renderer;
			particle_emitter.particle=particle_mc;
			var emmx:XML = 
			
			  
			    
			    
			      
			        
			          
			          
			        
			      
			      
			        
			          
			            
			            
			          
			        
			        
			          
			            
			            
			          
			        
			        
			          
			            
			            
			          
			        
			      
			      
			        
			          
			          
			        
			      
			      
			        
			          
			          
			        
			      
			      
			        
			          
			            
			            
			          
			        
			        
			          
			            
			            
			          
			        
			        
			          
			            
			            
			          
			        
			      
			    
			  
			;
			particle_emitter.fromXML(emmx);
			particle_emitter.start();
		}
		public function key_down(event:KeyboardEvent):void {
			switch (event.keyCode) {
				case 39 :
					rear_motor_added.SetMotorSpeed(10);
					front_motor_added.SetMotorSpeed(10);
					break;
				case 37 :
					rear_motor_added.SetMotorSpeed(-10);
					front_motor_added.SetMotorSpeed(-10);
					break;
			}
		}
		public function debug_draw():void {
			var m_sprite:Sprite;
			m_sprite = new Sprite();
			addChild(m_sprite);
			var dbgDraw:b2DebugDraw = new b2DebugDraw();
			var dbgSprite:Sprite = new Sprite();
			m_sprite.addChild(dbgSprite);
			dbgDraw.SetSprite(m_sprite);
			dbgDraw.SetDrawScale(30);
			dbgDraw.SetFillAlpha(0.5);
			dbgDraw.SetLineThickness(1);
			dbgDraw.SetFlags(b2DebugDraw.e_shapeBit);
			world.SetDebugDraw(dbgDraw);
		}
		public function update(e : Event):void {
			world.Step(1/30,10,10);
			world.ClearForces();
			world.DrawDebugData();
			for (var bb:b2Body = world.GetBodyList(); bb; bb = bb.GetNext()) {
				if (bb.GetUserData()) {
					particle_emitter.x=bb.GetPosition().x*30;
					particle_emitter.y=bb.GetPosition().y*30;
				}
			}
		}
	}
}

As you can see, the partigen code is very small, the most of the code is the particle XML itself.

And this is the result: I wanted fake bodies to spread from the car’s body.

Move the car with left/right arrow keys and enjoy.

Final considerations

Partigen 2 is the most complete tool to create particle effects with Flash IDE and API, in a couple of minutes you will be able to create amazing effects, saving hours of trial and error.

Desuade is so confident that you’ll fall even more in love with Partigen 2, it comes with a 100% satisfaction, 60 day money-back guarantee. A single license costs $97, and it’s positively a must-have.

Get the most popular Phaser 3 book

Through 202 pages, 32 source code examples and an Android Studio project you will learn how to build cross platform HTML5 games and create a complete game along the way.

Get the book

214 GAME PROTOTYPES EXPLAINED WITH SOURCE CODE
// 1+2=3
// 100 rounds
// 10000000
// 2 Cars
// 2048
// A Blocky Christmas
// A Jumping Block
// A Life of Logic
// Angry Birds
// Angry Birds Space
// Artillery
// Astro-PANIC!
// Avoider
// Back to Square One
// Ball Game
// Ball vs Ball
// Ball: Revamped
// Balloon Invasion
// BallPusher
// Ballz
// Bar Balance
// Bejeweled
// Biggification
// Block it
// Blockage
// Bloons
// Boids
// Bombuzal
// Boom Dots
// Bouncing Ball
// Bouncing Ball 2
// Bouncy Light
// BoxHead
// Breakout
// Bricks
// Bubble Chaos
// Bubbles 2
// Card Game
// Castle Ramble
// Chronotron
// Circle Chain
// Circle Path
// Circle Race
// Circular endless runner
// Cirplosion
// CLOCKS - The Game
// Color Hit
// Color Jump
// ColorFill
// Columns
// Concentration
// Crossy Road
// Crush the Castle
// Cube Jump
// CubesOut
// Dash N Blast
// Dashy Panda
// Deflection
// Diamond Digger Saga
// Don't touch the spikes
// Dots
// Down The Mountain
// Drag and Match
// Draw Game
// Drop Wizard
// DROP'd
// Dudeski
// Dungeon Raid
// Educational Game
// Elasticity
// Endless Runner
// Erase Box
// Eskiv
// Farm Heroes Saga
// Filler
// Flappy Bird
// Fling
// Flipping Legend
// Floaty Light
// Fuse Ballz
// GearTaker
// Gem Sweeper
// Globe
// Goat Rider
// Gold Miner
// Grindstone
// GuessNext
// Helicopter
// Hero Emblems
// Hero Slide
// Hexagonal Tiles
// HookPod
// Hop Hop Hop Underwater
// Horizontal Endless Runner
// Hundreds
// Hungry Hero
// Hurry it's Christmas
// InkTd
// Iromeku
// Jet Set Willy
// Jigsaw Game
// Knife Hit
// Knightfall
// Legends of Runeterra
// Lep's World
// Line Rider
// Lumines
// Magick
// MagOrMin
// Mass Attack
// Math Game
// Maze
// Meeblings
// Memdot
// Metro Siberia Underground
// Mike Dangers
// Mikey Hooks
// Nano War
// Nodes
// o:anquan
// One Button Game
// One Tap RPG
// Ononmin
// Pacco
// Perfect Square!
// Perfectionism
// Phyballs
// Pixel Purge
// PixelField
// Planet Revenge
// Plants Vs Zombies
// Platform
// Platform game
// Plus+Plus
// Pocket Snap
// Poker
// Pool
// Pop the Lock
// Pop to Save
// Poux
// Pudi
// Pumpkin Story
// Puppet Bird
// Pyramids of Ra
// qomp
// Quick Switch
// Racing
// Radical
// Rebuild Chile
// Renju
// Rise Above
// Risky Road
// Roguelike
// Roly Poly
// Run Around
// Rush Hour
// SameGame
// SamePhysics
// Save the Totem
// Security
// Serious Scramblers
// Shrink it
// Sling
// Slingy
// Snowflakes
// Sokoban
// Space Checkers
// Space is Key
// Spellfall
// Spinny Gun
// Splitter
// Spring Ninja
// Sproing
// Stabilize!
// Stack
// Stick Hero
// String Avoider
// Stringy
// Sudoku
// Super Mario Bros
// Surfingers
// Survival Horror
// Talesworth Adventure
// Tetris
// The Impossible Line
// The Moops - Combos of Joy
// The Next Arrow
// Threes
// Tic Tac Toe
// Timberman
// Tiny Wings
// Tipsy Tower
// Toony
// Totem Destroyer
// Tower Defense
// Trick Shot
// Tunnelball
// Turn
// Turnellio
// TwinSpin
// vvvvvv
// Warp Shift
// Way of an Idea
// Whack a Creep
// Wheel of Fortune
// Where's my Water
// Wish Upon a Star
// Word Game
// Wordle
// Worms
// Yanga
// Yeah Bunny
// Zhed
// zNumbers