Advanced Animation with Drawing API

February 6, 2009 by: smonte

This tutorial teaches you how to combine basic animation with the ActionScript 3 Drawing API.

Setting up the environment

1. Create a new document of size 300×300.

2. Draw a ball of size 10×10.

3. Convert the ball into a movie clip called “Particle” (registration point in the center).

4. Remove the ball (Particle) from the stage.

5. Linkage the Particle movie clip to a class called “Particle”.

6. Create a class (.as file) called “Particle”. Type the following.

package {
 
        import flash.display.MovieClip;
 
        public class Particle extends MovieClip {
 
                //We need different speeds for different particles.
                //These variables can be accessed from the main movie, because they are public.
                public var speedX:Number;
                public var speedY:Number;
 
                function Particle ():void {
 
                }
        }
}

That’s it for the setup. Now let’s start to animate things!

Moving into ActionScript 3.0

7. First, let’s set up the particles to the stage and add some effects. Type the following.

 
//We need few imports for the filters
import fl.motion.Color;
import flash.geom.ColorTransform;
 
//Create an array for the particles for later use
var numberOfParticles:Number = 30;
var particlesArray:Array = new Array();
 
//This loop creates 30 particles that are positioned randomly on the stage. 
//We also add some effects to the particles
for (var i=0; i < numberOfParticles; i++) {
 
        var particle:Particle = new Particle();
 
        //Give random x and y speed to the particle. 
        //Math.random returns a random number n, where 0 <= n < 1.
        particle.speedX = 2 + Math.random();
        particle.speedY = 2 + Math.random();
 
        //Set the starting position
        particle.y = Math.random() * stage.stageHeight;
        particle.x = Math.random() * stage.stageWidth;
 
        //Set a random tint to the particle, so they will have different colors.
        var ct:Color = new Color();
        ct.setTint (0xFFFFFF * Math.random(), 0.5);
        particle.transform.colorTransform = ct;
 
        //Set random size to the particles, so the particles will differ in size
        particle.scaleX = 0.5 + Math.random();
        particle.scaleY = particle.scaleX;
 
        //This array is used to store all of the filters
        var particleFilters:Array = new Array();
 
        //Create a different blur effect in each particle
        var tempBlurAmount = Math.random()*4;
        var blur:BlurFilter = new BlurFilter(tempBlurAmount, tempBlurAmount, 1);
        particleFilters.push (blur);
 
        //Create a glow effect in each particle
        var color:Number = 0x000000;
        var alphaValue:Number = 0.5;
        var blurX:Number = 20;
        var blurY:Number = 20;
        var strength:Number = 5;
        var glow:GlowFilter = new GlowFilter(color,
                                          alphaValue,
                                          blurX,
                                          blurY,
                                          strength);
 
        particleFilters.push (glow);
 
        //Apply the created filters to the particle (blur & glow)
        particle.filters = particleFilters;
 
        //Add the particle to the stage and push it into an array for later use
        addChild (particle);
        particlesArray.push (particle);
}

Allthough that may look hard, it’s actually very simple. The comments should explain enough, about what we’re doing in each portion. You should now have something like the following. Feel free to change some values for different look!

Animating the particles

8. To move the particles randomly, type the following.

addEventListener (Event.ENTER_FRAME, enterFrameHandler);
 
//This function is responsible for animation
function enterFrameHandler (e:Event):void {
 
        //Let's loop through the particles
        for (i=0; i < particlesArray.length; i++) {
 
                var particleOne:Particle = particlesArray[i];
                //Move the particle to a new location
                particleOne.x += particleOne.speedX;
                particleOne.y += particleOne.speedY;
 
                //Check the boundaries. 
                //If a hit occurs, multiply the speed by (-1) to reverse the speed.
 
                //Right edge
                if (particleOne.x > stage.stageWidth) {
                        particleOne.x = stage.stageWidth - particleOne.width/2;
                        particleOne.speedX *= -1;
                }
 
                //Left edge
                else if (particleOne.x < 0) {
                        particleOne.x = particleOne.width/2;
                        particleOne.speedX *= -1;
                }
 
                //Bottom
                if (particleOne.y > stage.stageHeight) {
                        particleOne.y = stage.stageHeight - particleOne.width/2;
                        particleOne.speedY *= -1;
                }
 
                //Top
                else if (particleOne.y < 0) {
                        particleOne.y = particleOne.width/2;
                        particleOne.speedY *= -1;
                }
        }
}

If you test your movie, you should have similar movement as in the following animation.

Adding the Lines to the Animation

9. To add the lines to the animation, modify the enterFrameHandler, so it looks like the following.

function enterFrameHandler (e:Event):void {
 
        //Clear the previous lines
        graphics.clear();
 
        //Let's loop through the particles
        for (i=0; i < particlesArray.length; i++) {
 
                var particleOne:Particle = particlesArray[i];
                //Move the particle to a new location
                particleOne.x += particleOne.speedX;
                particleOne.y += particleOne.speedY;
 
                //Check the boundaries
                if (particleOne.x > stage.stageWidth) {
                        particleOne.x = stage.stageWidth - particleOne.width/2;
                        particleOne.speedX *= -1;
                }
                else if (particleOne.x < 0) {
                        particleOne.x = particleOne.width/2;
                        particleOne.speedX *= -1;
                }
                if (particleOne.y > stage.stageHeight) {
                        particleOne.y = stage.stageHeight - particleOne.width/2;
                        particleOne.speedY *= -1;
                }
                else if (particleOne.y < 0) {
                        particleOne.y = particleOne.width/2;
                        particleOne.speedY *= -1;
                }
 
                //Go through the other particles to check the distance with the first particle
                for (var j:uint = i + 1; j < particlesArray.length; j++) {
 
                        var particleTwo:Particle = particlesArray[j];
 
                        var distanceX:Number = particleOne.x - particleTwo.x;
                        var distanceY:Number = particleOne.y - particleTwo.y;
                        //Use Pythagorean theorem (a^2 + b^2 = c^2) to calculate the distance 
                        var distance:Number = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
 
                        //If the distance is smaller than 80px, draw a line between the particles
                        if (distance < 80) {
                                drawLine (particleOne, particleTwo);
                        }
                }
        }
}

Add the following function after the enterFrameHandler

//This function draws a black line between two particles
function drawLine (particleOne:Particle, particleTwo:Particle):void {
        graphics.lineStyle (1, 0x000000);
        graphics.moveTo (particleOne.x, particleOne.y);
        graphics.lineTo (particleTwo.x, particleTwo.y);
}

That’s it! Test your movie. Feel free to use this code in your projects.

Final Code

//We need few imports for the filters
import fl.motion.Color;
import flash.geom.ColorTransform;
 
//Create an array for the particles for later use
var numberOfParticles:Number = 30;
var particlesArray:Array = new Array();
 
//This loop creates 30 particles that are positioned randomly on the stage. 
//We also add some effects to the particles
for (var i=0; i < numberOfParticles; i++) {
 
        var particle:Particle = new Particle();
 
        //Give random x and y speed to the particle. 
        //Math.random returns a random number n, where 0 <= n < 1.
        particle.speedX = 2 + Math.random();
        particle.speedY = 2 + Math.random();
 
        //Set the starting position
        particle.y = Math.random() * stage.stageHeight;
        particle.x = Math.random() * stage.stageWidth;
 
        //Set a random tint to the particle, so they will have different colors.
        var ct:Color = new Color();
        ct.setTint (0xFFFFFF * Math.random(), 0.5);
        particle.transform.colorTransform = ct;
 
        //Set random size to the particles, so the particles will differ in size
        particle.scaleX = 0.5 + Math.random();
        particle.scaleY = particle.scaleX;
 
        //This array is used to store all of the filters
        var particleFilters:Array = new Array();
 
        //Create a different blur effect in each particle
        var tempBlurAmount = Math.random()*4;
        var blur:BlurFilter = new BlurFilter(tempBlurAmount, tempBlurAmount, 1);
        particleFilters.push (blur);
 
        //Create a glow effect in each particle
        var color:Number = 0x000000;
        var alphaValue:Number = 0.5;
        var blurX:Number = 20;
        var blurY:Number = 20;
        var strength:Number = 5;
        var glow:GlowFilter = new GlowFilter(color,
                                          alphaValue,
                                          blurX,
                                          blurY,
                                          strength);
 
        particleFilters.push (glow);
 
        //Apply the created filters to the particle (blur & glow)
        particle.filters = particleFilters;
 
        //Add the particle to the stage and push it into an array for later use
        addChild (particle);
        particlesArray.push (particle);
}
 
addEventListener (Event.ENTER_FRAME, enterFrameHandler);
 
//This function is responsible for animation
function enterFrameHandler (e:Event):void {
 
        //Clear the previous lines
        graphics.clear();
 
        //Let's loop through the particles
        for (i=0; i < particlesArray.length; i++) {
 
                var particleOne:Particle = particlesArray[i];
                //Move the particle to a new location
                particleOne.x += particleOne.speedX;
                particleOne.y += particleOne.speedY;
 
                //Check the boundaries
                if (particleOne.x > stage.stageWidth) {
                        particleOne.x = stage.stageWidth - particleOne.width/2;
                        particleOne.speedX *= -1;
                }
                else if (particleOne.x < 0) {
                        particleOne.x = particleOne.width/2;
                        particleOne.speedX *= -1;
                }
                if (particleOne.y > stage.stageHeight) {
                        particleOne.y = stage.stageHeight - particleOne.width/2;
                        particleOne.speedY *= -1;
                }
                else if (particleOne.y < 0) {
                        particleOne.y = particleOne.width/2;
                        particleOne.speedY *= -1;
                }
 
                //Go through the other particles to check the distance with the first particle
                for (var j:uint = i + 1; j < particlesArray.length; j++) {
 
                        var particleTwo:Particle = particlesArray[j];
 
                        var distanceX:Number = particleOne.x - particleTwo.x;
                        var distanceY:Number = particleOne.y - particleTwo.y;
                        //Use Pythagorean theorem (a^2 + b^2 = c^2) to calculate the distance 
                        var distance:Number = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
 
                        //If the distance is smaller than 80px, draw a line between the particles
                        if (distance < 80) {
                                drawLine (particleOne, particleTwo);
                        }
                }
        }
}
 
//This function draws a black line between two particles
function drawLine (particleOne:Particle, particleTwo:Particle):void {
        graphics.lineStyle (1, 0x000000);
        graphics.moveTo (particleOne.x, particleOne.y);
        graphics.lineTo (particleTwo.x, particleTwo.y);
}
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx

Related tutorials:

  1. Creating a Chain Explosion
  2. Snowfall Effect
  3. Creating Fireworks with ActionScript 3
  4. ActionScript 3 Drawing API
  5. Creating Random Lines with Animation

Comments

4 Responses to “Advanced Animation with Drawing API”
  1. MZY from UniSA says:

    Nice tutorial- I didn’t know how to draw movie clips onto the stage… until now! Funnily enough I didn’t use this tutorial to do the same things- I used it more for the principle idea. Anyway cheers from Australia!

    Log in to Reply
  2. cctan says:

    many thanks for all these great tutorials on your site. they are very well explained and really helpful.

    Log in to Reply
  3. Thanks for the tutorial. My design is quite similar and this tut has definitely been a help to me.

    Log in to Reply
  4. Jx says:

    Thanks so much for the tutorial. I’m working on trying to create a shape with as3 that will have the affect of a shape tween and this helped me get started.

    Log in to Reply

Leave a Reply

You must be logged in to post a comment.