00001 import mx.utils.Delegate;
00002
00003 import gugga.animations.IAnimation;
00004 import gugga.common.EventDescriptor;
00005 import gugga.events.EventDispatcher;
00006 import gugga.utils.Listener;
00007 import gugga.utils.OnEnterFrameBeacon;
00008
00012 class gugga.animations.BlinkingAnimation
00013 extends EventDispatcher
00014 implements IAnimation
00015 {
00016 private var mMovieClip:MovieClip;
00017 private var mBlinksCount:Number;
00018 private var mBlinkFramesDuration:Number = 1;
00019
00020 private var mFramesSinceLastBlink:Number;
00021 private var mBlinksElapsed:Number;
00022 private var mInitialVisibility:Boolean;
00023
00024 private var mOnEnterFrameBeaconListener:Listener;
00025
00026 private var mCuePoints : Array;
00027
00028 public function BlinkingAnimation(
00029 aMovieClip:MovieClip, aBlinksCount:Number, aBlinkFramesDuration:Number)
00030 {
00031 super();
00032
00033 mMovieClip = aMovieClip;
00034 mBlinksCount = aBlinksCount;
00035
00036 if(aBlinkFramesDuration)
00037 {
00038 mBlinkFramesDuration = aBlinkFramesDuration;
00039 }
00040
00041 mCuePoints = new Array();
00042 }
00043
00044 public function addCuePoint(aBlinkNumber:Number, aEventName:String) : Void
00045 {
00046 mCuePoints.push({position: aBlinkNumber, event:aEventName});
00047 mCuePoints.sortOn("position");
00048 }
00049
00050 public function start() : Void
00051 {
00052 if(!isRunning())
00053 {
00054 mBlinksElapsed = 0;
00055 mFramesSinceLastBlink = 0;
00056 mInitialVisibility = mMovieClip._visible;
00057
00058 dispatchEvent({type: "start", target: this});
00059
00060 if(mBlinksCount > 0)
00061 {
00062 mOnEnterFrameBeaconListener = Listener.create(
00063 new EventDescriptor(OnEnterFrameBeacon.Instance, "onEnterFrame"),
00064 Delegate.create(this, onEnterFrame));
00065 }
00066 else
00067 {
00068 completed();
00069 }
00070 }
00071 }
00072
00073 public function isRunning() : Boolean
00074 {
00075 return (mOnEnterFrameBeaconListener != null);
00076 }
00077
00078 public function isImmediatelyInterruptable() : Boolean
00079 {
00080 return true;
00081 }
00082
00083 public function interrupt() : Void
00084 {
00085 mOnEnterFrameBeaconListener.stop();
00086 mOnEnterFrameBeaconListener = null;
00087 mMovieClip._visible = mInitialVisibility;
00088
00089 dispatchEvent({type: "interrupted", target: this});
00090 }
00091
00092 private function onEnterFrame() : Void
00093 {
00094
00095 mFramesSinceLastBlink++;
00096
00097 if(mFramesSinceLastBlink >= mBlinkFramesDuration)
00098 {
00099 mBlinksElapsed++;
00100 mFramesSinceLastBlink = 0;
00101 }
00102
00103 if(mBlinksElapsed <= mBlinksCount)
00104 {
00105 mMovieClip._visible = !mMovieClip._visible;
00106 }
00107 else
00108 {
00109 completed();
00110 }
00111 }
00112
00113 private function completed() : Void
00114 {
00115 mOnEnterFrameBeaconListener.stop();
00116 mOnEnterFrameBeaconListener = null;
00117
00118 dispatchEvent({type:"completed", target:this});
00119 }
00120 }