Talking about Actionscript 3, Box2D, Flash and Reviews.
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.
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.