Tweening via the timeline in Flash can oftentimes be too computationally expensive, especially if your application is some massive, complex flash game or other. What I am going to present in this Flash Cove AS3 tutorial is an example of using some third-party software to do all your tweening via actionscript code. There are numerous benefits to tweening via actionscript, as listed here:
- Less computationally expensive
- Tweening may be done on the fly dynamically
- Tweens could be based off real-time user input
- Programmatic tweening is less graphically expensive
- Easy to edit, make changes, and upkeep as time goes by
Though there are thousands of different 3rd-party tweening packages, my absolute favorite and best in class is the caurina.transitions.Tweener (AS2 and AS3). It is simple to install and easy to use, has plenty of functionality, and is totally free! The creator’s website is here, and the code for download is located
here. I’ll explain some of the tips and trick throughout this flash tweening tutorial, but before I start, I might as well give you a taste of what’s to come..
Here's the final result, a dice roll simulation in flash, animation completely controlled by actionscript 3 code.
Let’s go ahead and start.
- Create a new flash document, 550px by 400px. Actionscript 3.
- Download the caurina.transitions.Tweener package from the Google Code page. Extract the “caurina” folder form the .zip file, and put it in the same directory with your *.fla you created in the previous step. Make sure your file hierarchy looks like the following image.

- Once your directory is setup, head back in to the flash file, and create a new movieclip (Ctrl + F8); name it “die”.
- Create a second layer inside the “die” movieclip, and on the bottom layer, draw a square die shape, about 100px by 100px.

-
Spread that bottom layer of the dice background along 6 frames, by either copying and pasting the single frame, or by jamming the F6 key repeatedly. On the top layer for each frame, draw dots over the dice backdrop, to represent the numbers 1-6, as you would see on a normal die.

- Now that the art is drawn for each of the 6 faces, it’s time to add a little code. On every single die face keyframe, go ahead and add the line of code:
stop();
Though this isn’t required necessarily, I like putting the stop() ocmmand on every frame just in case to prevent the dice from jumping frame unnecessarily as each face is intended to be consistently static, all the time.

- We are officially done with setting up the die movieclip, now to move on to the shadow. Create a new movieclip again (Ctrl+F8), name it “shadow”. Once inside the movieclip, the rest is easy. All you need to do is draw a gray semi-circle, maybe 120px by 40px, and then exit back out to the main scene.

- Before we write the code, we need to setup export for our die and shadow classes. In the library panel, right-click on each of the two classes and select “Properties”. Inside the popup, the only thing you need to do is check the box “Export for Actionscript” as seen in the image below.

- The final step for this flash tutorial is writing our actionscript in the main file; which, to some people, may be pretty hefty. I am going to chunk each function in to separate pieces, but also be sure to review the comments inside the code for further clarification.
First off, initialization:
(as a note, all the following code can be copied and pasted straight in to your first frame on Scene 1, right after the other.)
var dice:Array; //setup dynamic arrays for both the dice and shadows.
var shadows:Array;
var stop_go_number:Number = 4;
//this stop_go_number variable is being used to time and regulate the dice rolls
function init():void{ //initiailization function. Clean way to wrapup the starting code.
dice = new Array(); //initialize the arrays
shadows = new Array();
for(var gto:Number = 0; gto < 4; gto++){// loop through and create 4 new instances of shadows and dice.
shadows[gto] = new shadow();
shadows[gto].y = 295;
shadows[gto].x = gto*50 - 50; //set each at a displacement from eachother
shadows[gto].scaleX = 0.50; //top left of the scene
shadows[gto].scaleY = 0.50;
shadows[gto].alpha = 0;
shadows[gto].mouseEnabled = false;
MovieClip(root).addChild(shadows[gto]); //actually add the dynamically created shadow to the stage
dice[gto] = new die();
dice[gto].y = -120;
dice[gto].x = gto*50 - 50; //do the same for shadows and dice
dice[gto].scaleX = 0.40;
dice[gto].scaleY = 0.40;
dice[gto].mouseEnabled = false;
MovieClip(root).addChild(dice[gto]); //actually add the dynamically created die to the stage
}
}
What this code accomplished was:
- Importing the caurina package so tweening is available to us
- Initialization of our arrays of procedurally generated movieclips
- The creation of those shadows and dice
- and calling addChild() to actually populate the stage.
Then our roll function:
if(stop_go_number == 4){ //if stop_go is equal to 4, that means all dice have finished rolling
stop_go_number = 0; //so we can go ahead and start over
//reset all the animation pieces!
for(var ccc:Number = 0; ccc < 4; ccc++){ //the dice and shadows are lying on-stage, we need to move them off again.
dice[ccc].x -= 200; //shift the dice back top-left
dice[ccc].y -= 400;
shadows[ccc].x -= 200; //move the shadow left
shadows[ccc].scaleX = 0.5; //set the scale back to our original setup
shadows[ccc].scaleY = 0.5;
shadows[ccc].alpha = 0; //set alpha(visibility) to 0.
}
for(var c:Number = 0; c < 4; c++){ //here where we actually execute the tweens
var additive:Number = Math.floor(Math.random() * 6) + 1; //generate a random number between 1-6
dice[c].gotoAndStop(additive); //set the dice face to that number
//this tween moves the die along the y-axis, and rotates
Tweener.addTween(dice[c], {y: 280, rotation: 360, time: 2.5, delay: c * 0.10, transition: "easeOutBounce"});
//this tween moves the die along the x-axis and, on completion, increments our stop_go_number
Tweener.addTween(dice[c], {x: 120 + c*50, time: 2.5, delay: c * 0.10, transition: "easeOutQuad", onComplete: function():void{ stop_go_number++; }});
//this shifts our shadow along the x axis
Tweener.addTween(shadows[c], {x: 120 + c*50, time: 2.5, delay: c * 0.10, transition: "easeOutQuad"});
//and the final one tweens our alpha and scaling for the shadow, giving it that bouncy feel.
Tweener.addTween(shadows[c], {scaleX: 0.2, scaleY: 0.2, alpha: 0.5, time: 2.5, delay: c * 0.10, transition: "easeOutElastic"});
}
}
}
What the “roll” function does, in steps, is:
- Checks to see if the dice are idle; if they are, go ahead and proceed. if they aren’t, exit the function
- Once inside, iterate over all the dice and shadows, resetting their positions to top-left, off-screen.
- Then, make a second loop; where for each shadow/die pair, set die face and execute tweens.
The tricky part in the roll() function are the tweener calls. I’ll go ahead and explain how these work. Everytime you want to create an actionscript, it always follows this syntax:
param’s can be any attirbute of the movieclip (x, y, scaleX, scaleY, color, width, height, alpha, etc..), and there are also some special parameters, as follows:
- time: how long you want the transition to take from present state to future state
- delay: how long you want (in seconds) the tween to wait before executing. This is a useful tool if you want a delay between Tween starts, especially when assigning them all very quickly through a loop. I did this in the roll() function above.
- onComplete: You can either put a function_name there and reference a later function in the actionscript file, or you can inject an anonymous function like I did in the roll() method above, this is good to do if what you need to execute is trivial or simple. onComplete calls whateevr function you point do once the tween is done with its transition.
Those are the only parameters I used in this tutorial, but there are plenty move available (such as onCompleteParams), which can be viewed on the official documentation page.
http://hosted.zeh.com.br/tweener/docs/en-us/
And finally, our last 2 lines of code, execution:
//every time the mouse is clicked, our roll() function will be called.
stage.addEventListener(MouseEvent.CLICK, roll); //add CLICK
Putting all of this together and publishing via (Crtl+Enter) brings us to the following state:
All that's left is a little personal taste, such as the gradient background and some text ques so our user knows what to do. The gradient I used was a (white, gray, white), and the pixelfont I put in my version is called JOYSTIX, available at http://www.dafont.com/joystix.font.
Good blog post and decent site template design. I am more into web design and Search Engine Optimization. Nonetheless, would check back again soon!
I am more into singapore web hosting. Nonetheless great post and I would check back again soon! http://www.vodien.com/dedicated-server.php
useful and informative. thank you for taking the time to put this up. my blog: xbox 360 wireless adapter
I’d have to comply with you on this. Which is not something I typically do! I really like reading a post that will make people think. Also, thanks for allowing me to comment!
Very nice post, I surely love this site, keep it up.
A lot of thanks for all of the work on this web site. Kim really likes managing investigations and it’s obvious why. We all notice all relating to the compelling method you deliver reliable tips on the web site and in addition strongly encourage response from website visitors about this point plus our princess is actually understanding a whole lot. Take advantage of the remaining portion of the year. You are always conducting a splendid job.
Awesome post mate.
This is a really great blog. Thx to the auther
Once I initially commented I clicked the -Notify me when new comments are added- checkbox and now each time a remark is added I get 4 emails with the same comment. Is there any way you may remove me from that service? Thanks!
Great goods from you, man. I’ve understand your stuff previous to and you’re just extremely fantastic. I actually like what you’ve acquired here, certainly like what you’re stating and the way in which you say it. You make it entertaining and you still take care of to keep it sensible. I can’t wait to read much more from you. This is actually a wonderful web site.