Read through the easy steps in this Quick Tip to create a Minimalistic SandClock with ActionScript.
Final Result Preview
Let's take a look at the final result we will be working towards:
Step 1: Brief Overview
Using Arrays and a premade square MovieClip we will create a SandClock that will be animated by a Timer.
Step 2: Set Up Your Flash File
Launch Flash and create a new Flash Document, set the stage size to 400x250px and the frame rate to 24fps.
Step 3: Interface
This is the interface we'll be using, the squares in the image are actually one single blue square MovieClip exported for use with ActionScript, with a linkage name of Square. A simple button named startButton will be used to build and start the clock.
Step 4: ActionScript
Create a new ActionScript Class (Cmd+N), save the file as Main.as and write the following lines. Read through the comments in the code in order to fully understand the class behavior.
package { import flash.display.Sprite; import flash.utils.Timer; import flash.events.TimerEvent; import flash.events.MouseEvent; public class Main extends Sprite { private var clockArray:Array = [15,13,11,9,7,3,1];//Stores the number of squares per line private var top:Array = []; //will hold the squares on the top part of the sandclock private var container:Sprite = new Sprite(); //stores all the movieclips private var containerCopy:Sprite = new Sprite(); //will duplicate the top part to make the bottom private var timer:Timer = new Timer(1000); //a timer executed every second private var counter:int = 0; //will count the seconds, used to stop the timer public function Main():void { startButton.addEventListener(MouseEvent.MOUSE_UP, buildClock);//a listener in the start button } private function buildClock(e:MouseEvent):void { startButton.removeEventListener(MouseEvent.MOUSE_UP, buildClock); //disables the button startButton.enabled = false; var clockLength:int = clockArray.length; /* this double for browses through the clock array length AND the value of each array element creating 7 lines (length) of squares with 15, 13, 11(element value) and so on */ for (var i:int = 0; i < clockLength; i++) { for (var j:int = 0; j < clockArray[i]; j++) { var s:Square = new Square(); var sc:Square = new Square(); s.x = 70.5 + (s.width * j) + (1 * j) + (i * (s.width + 1)); s.y = 84.5 + (s.height + 1) * i; sc.x = s.x; sc.y = s.y; if (i >= 5) { s.x = 70.5 + (s.width * j) + (1 * j) + (i * ((s.width) + 1)) + (s.width * 2 - 4); sc.x = s.x; } container.addChild(s); containerCopy.addChild(sc); //creates a copy for the bottom part top.push(s); sc.alpha = 0.2; //makes the bottom part semi transparent } addChild(container); containerCopy.x = 225; //positions and rotates the bottom part containerCopy.y = 247; containerCopy.rotation = 180; addChild(containerCopy); } timer.addEventListener(TimerEvent.TIMER, startClock); //start the timer timer.start(); } /* this function executes every second, it changes the alpha of the corresponding square to make the sand effect. when the time is done stops the timer and calls a function */ private function startClock(e:TimerEvent):void { container.getChildAt(counter).alpha = 0.2; containerCopy.getChildAt(counter).alpha = 1; counter++; //60 seconds if (counter >= 59) { timer.stop(); timer.removeEventListener(TimerEvent.TIMER, startClock); timeComplete(); } } private function timeComplete():void { //do something here } } }
You can adjust the Timer and the counter value to make the sandclock duration greater or shorter.
Step 5: Document Class
Remember to add the class name to the Class field in the Publish section of the Properties panel.
Conclusion
Why not use this SandClock to give your application or game a nice touch?
I hope you liked this tutorial, thank you for reading!
Comments