Flash_and_Flex_03_2009

Animating with ActionScript

Listing 7. Document class using the animation stack

public static function initClip( mc : MovieClip, handler : Function ) : void { var labels : Array = mc.currentLabels; for each ( var i : FrameLabel in labels ) mc.addFrameScript( i.frame – 1, handler ); } public static function addAnimationToStack( clip : MovieClip, startLabel : String, endLabel : String, animation : Object = null , duration : Number = 1 ) : void { if ( !_animStack ) _animStack = new Array(); _animStack.push( { clip : clip, startLabel : startLabel, endLabel : endLabel, } private static function animateWithStack( clip : TimelineManager ) : void { var curAnim = _animStack[ _pointer ]; if ( clip.currentLabel == curAnim.endLabel && !_ dynAnimating ) { curAnim.clip.gotoAndStop( curAnim.startLabel ); curAnim.animation.onComplete = handleTweenliteAnim Completed; curAnim.animation.frame = getFrameNumberFromLabel( curAnim.clip, curAnim.endLabel ); TweenLite.to( curAnim.clip, curAnim.duration, curAnim.animation ); } else curAnim.clip.gotoAndPlay( curAnim.startLabel ); } } private static function handleTweenliteAnimCompleted() : void { _dynAnimating = false ; var curAnim = _animStack[ _pointer ]; curAnim.clip.gotoAndStop( curAnim.endLabel ); animateWithStack( curAnim.clip ); } private static function getFrameNumberFromLabel( clip : MovieClip, label : String ) : int { animation : animation, duration : duration } ); clip.stop(); _pointer++; if ( _pointer >= _animStack.length ) _pointer = 0; curAnim = _animStack[ _pointer ]; if ( curAnim.animation != null ) { _dynAnimating = true ;

package { import flash.display.MovieClip; import TimelineManager; import FrameEvent; public class Main3 extends MovieClip { public function Main3() {

_ballAnimation1.addEventListener( FrameEvent.LABEL, handleFrameLabel ); _ballAnimation2.addEventListener( FrameEvent.LABEL, handleFrameLabel ); TimelineManager.addAnimationToStack( _ballAnimation1, "fGrow", "fMoveForward" ); TimelineManager.addAnimationToStack( _ballAnimation2, "fGrow", "fMoveForward" ); TimelineManager.addAnimationToStack( _ballAnimation1, "fMoveForward", "fMoveBackward" ); TimelineManager.addAnimationToStack( _ballAnimation2, "fMoveForward", "fMoveBackward" ); TimelineManager.addAnimationToStack( _ballAnimation1, "fMoveBackward", "fShrink" ); TimelineManager.addAnimationToStack( _ballAnimation2, "fMoveBackward", "fShrink" ); TimelineManager.addAnimationToStack( _ballAnimation1, "fShrink", "fGrow" ); TimelineManager.addAnimationToStack( _ballAnimation2, "fShrink", "fGrow" ); } private function handleFrameLabel( event : FrameEvent ) : void {

_flText1.text = _ballAnimation1.currentLabel; _flText2.text = _ballAnimation2.currentLabel; } } }

Listing 8. TimelineManager class with dynamic animation support

package { import flash.display.MovieClip; import flash.display.FrameLabel; import gs.TweenLite; import FrameEvent; public class TimelineManager extends MovieClip {

private static var _animStack : Array; private static var _pointer : int = 0; private static var _dynAnimating : Boolean = false ; public function TimelineManager() { super (); initClip( this , handleFrameLabel ); } private function handleFrameLabel() : void { var f : FrameLabel = new FrameLabel( currentLabel, currentFrame ); dispatchEvent( new FrameEvent( FrameEvent.LABEL, new

var labels : Array = clip.currentLabels; for each ( var i : FrameLabel in labels ) if ( i.name == label ) return i.frame; return -1; } } }

FrameLabel( currentLabel, currentFrame ) ) );

if ( _animStack && _animStack.length > 0 ) animateWithStack( this ); }

03/2009 (5)

23

Made with FlippingBook HTML5