00001 import mx.utils.Delegate;
00002
00003 import gugga.animations.IAnimation;
00004 import gugga.animations.PropertiesTweenAnimation;
00005 import gugga.animations.PropertiesTweenAnimationType;
00006 import gugga.debug.Assertion;
00007 import gugga.events.EventDispatcher;
00008 import gugga.tween.TweensManager;
00009 import gugga.utils.EventRethrower;
00010
00014 class gugga.animations.FilterTweenAnimation
00015 extends EventDispatcher implements IAnimation
00016 {
00017 private var mSubject : MovieClip;
00018 private var mFilterObjectType : Function;
00019 private var mTweenedFilterProperties : Array;
00020 private var mTweenToValues : Array;
00021 private var mTweenTime : Number;
00022 private var mEasingEquatation : Function;
00023
00024 private var mFiltersArray : Array;
00025 private var mFilterInstance : Object;
00026 private var mFilterIndex : Number;
00027
00028 private var mPropertiesTweenAnimation : PropertiesTweenAnimation;
00029 private var mTweenType : PropertiesTweenAnimationType;
00030 private var mTweensUpdatedDelegate : Function;
00031
00032 public function FilterTweenAnimation()
00033 {
00034 super();
00035
00036 mPropertiesTweenAnimation = new PropertiesTweenAnimation();
00037
00038 EventRethrower.create(this, mPropertiesTweenAnimation, "completed");
00039 EventRethrower.create(this, mPropertiesTweenAnimation, "interrupted");
00040 EventRethrower.create(this, mPropertiesTweenAnimation, "start");
00041
00042 mPropertiesTweenAnimation.addEventListener("completed", Delegate.create(this, onCompleted));
00043
00044 mTweensUpdatedDelegate = Delegate.create(this, onTweensUpdated);
00045 }
00046
00047 public function setFrameTween
00048 (
00049 aSubject : MovieClip,
00050 aFilterObjectType : Function,
00051 aTweenedFilterProperties : Array,
00052 aTweenToValues : Array,
00053 aTweenTime : Number,
00054 aEasingEquation : Function
00055 ) : Void
00056 {
00057 mSubject = aSubject;
00058 mFilterObjectType = aFilterObjectType;
00059 mTweenedFilterProperties = aTweenedFilterProperties;
00060 mTweenToValues = aTweenToValues;
00061 mTweenTime = aTweenTime;
00062 mEasingEquatation = aEasingEquation;
00063
00064 mTweenType = PropertiesTweenAnimationType.FrameTween;
00065 }
00066
00067 public function setTimeTween
00068 (
00069 aSubject : MovieClip,
00070 aFilterObjectType : Function,
00071 aTweenedFilterProperties : Array,
00072 aTweenToValues : Array,
00073 aTweenTime : Number,
00074 aEasingEquation : Function
00075 ) : Void
00076 {
00077 mSubject = aSubject;
00078 mFilterObjectType = aFilterObjectType;
00079 mTweenedFilterProperties = aTweenedFilterProperties;
00080 mTweenToValues = aTweenToValues;
00081 mTweenTime = aTweenTime;
00082 mEasingEquatation = aEasingEquation;
00083
00084 mTweenType = PropertiesTweenAnimationType.TimeTween;
00085 }
00086
00087 public function addCuePoint(aPosition : Number, aEventName : String) : Void
00088 {
00089 mPropertiesTweenAnimation.addCuePoint(aPosition, aEventName);
00090 EventRethrower.create(this, mPropertiesTweenAnimation, aEventName);
00091 }
00092
00093 public function start() : Void
00094 {
00095 mFiltersArray = mSubject.filters;
00096 if(!mFiltersArray)
00097 {
00098 mFiltersArray = new Array();
00099 }
00100
00101 for (var i : Number = 0; i < mFiltersArray.length; i++)
00102 {
00103 if(mFiltersArray[i] instanceof mFilterObjectType)
00104 {
00105 Assertion.warningIfTrue(
00106 (mFilterInstance != null),
00107 "Subject's filters array contains multiple instances of the tweened filter type.",
00108 this, arguments);
00109
00110 mFilterInstance = mFiltersArray[i];
00111 mFilterIndex = i;
00112 }
00113 }
00114
00115 if(!mFilterInstance)
00116 {
00117 mFilterInstance = new mFilterObjectType();
00118 mFilterIndex = 0;
00119 mFiltersArray.push(mFilterInstance);
00120 }
00121
00122 if(mTweenType == PropertiesTweenAnimationType.FrameTween)
00123 {
00124 mPropertiesTweenAnimation.setFrameTween(
00125 mFilterInstance, mTweenedFilterProperties, mTweenToValues, mTweenTime, mEasingEquatation);
00126 }
00127 else
00128 {
00129 mPropertiesTweenAnimation.setTimeTween(
00130 mFilterInstance, mTweenedFilterProperties, mTweenToValues, mTweenTime, mEasingEquatation);
00131 }
00132
00133 TweensManager.Instance.addEventListener("tweensUpdated", mTweensUpdatedDelegate);
00134
00135 mPropertiesTweenAnimation.start();
00136 }
00137
00138 public function isRunning() : Boolean
00139 {
00140 return mPropertiesTweenAnimation.isRunning();
00141 }
00142
00143 public function isImmediatelyInterruptable() : Boolean
00144 {
00145 return mPropertiesTweenAnimation.isImmediatelyInterruptable();
00146 }
00147
00148 public function interrupt() : Void
00149 {
00150 TweensManager.Instance.removeEventListener("tweensUpdated", mTweensUpdatedDelegate);
00151 mPropertiesTweenAnimation.interrupt();
00152 mFilterInstance = null;
00153 mFiltersArray = null;
00154 }
00155
00156 private function onTweensUpdated () : Void
00157 {
00158 mFiltersArray[mFilterIndex] = mFilterInstance;
00159 mSubject.filters = mFiltersArray;
00160 }
00161
00162 private function onCompleted () : Void
00163 {
00164 TweensManager.Instance.removeEventListener("tweensUpdated", mTweensUpdatedDelegate);
00165 mFilterInstance = null;
00166 mFiltersArray = null;
00167 }
00168 }