protected void _InterpretAnimationData()
        {
            // make sure the animated sprite has been registered
            // (this is done to prevent errors that occur when trying to assign these values
            // during desrerialization.
            if (!IsRegistered)
                return;

            // make sure we have an animation data assigned
            if (_animationData == null)
                return;

            // make sure the animation data has been initialized
            if (!_animationData.IsInitialized)
            {
                // try to init
                _animationData.Init();

                // if still not initialized animation data must be borked...
                // quit now and drop the animation data to skip further initialization
                if (!_animationData.IsInitialized)
                {
                    Assert.Fatal(false, "T2DAnimatedSprite._InterpretAnimationData() - Initialization of animation data failed. Animation will not play.");
                    _animationData = null;
                    return;
                }
            }

            // pass the data on to the animation controller
            _ac.AnimationFrameCount = _animationData.AnimationFramesList.Count;
            _ac.AnimationDuration = _animationData.AnimationDuration;
            _ac.AnimationCycle = _animationData.AnimationCycle;

            // pass the material from the animation data to the quad
            _quad.Material = _animationData.Material;

            // set the texture coordinates dirty
            _currentFrameAreaDirty = true;

            // reset the animation data dirty flag
            _animationDataDirty = false;
        }
        /// <summary>
        /// Plays the specified animation data. When that animation is completed, the animation currently playing (at the time you call this method)
        /// will be loaded and resume from the time specified.
        /// </summary>
        /// <param name="data">The animation to play</param>
        /// <param name="autoRestoreTime">The time in seconds from which to continue playing the current animation.</param>
        public void PlayAnimation(T2DAnimationData data, float autoRestoreTime)
        {
            // create and push a new animation cue to the front of the queue
            _animationQueue.Insert(0, new T2DAnimationCue(_animationData, autoRestoreTime));

            // play the specified animation
            PlayAnimation(data);
        }
        /// <summary>
        /// Plays an animation with specified animation data and either queue up the currently playing animation to continue after 
        /// the specified animation is finished -or- clears all queued animations and does not auto-restore. If you do not wish to auto 
        /// restore the currently playing animation, but want to keep the animation queue intact, use the PlayAnimation(T2DAnimationData data) 
        /// version of this method.
        /// </summary>
        /// <param name="data">The animation data to use.</param>
        /// <param name="autoRestoreAnimation">True if the animated sprite should return to it's current animation once the specified animation 
        /// is finished. False if the animation should not auto restore and the entire animation queue should be cleared.</param>
        public void PlayAnimation(T2DAnimationData data, bool autoRestoreAnimation)
        {
            // either insert the current animation at the beginning of the the animation queue
            // or clear the animation queue entirely
            if (autoRestoreAnimation)
                _animationQueue.Insert(0, GenerateAnimationCue());
            else
                _animationQueue.Clear();

            // replace the current animation data with the one specified
            PlayAnimation(data);
        }
 /// <summary>
 /// Generates and adds an animation cue to the animation queue to be played after all animations are finished.
 /// </summary>
 /// <param name="animData">The animation data to add to the animation queue.</param>
 public void EnqueueAnimation(T2DAnimationData animData)
 {
     // creates an animation cue for the specified animation data
     // at time 0 and adds it to the queue
     _animationQueue.Add(new T2DAnimationCue(animData, 0.0f));
 }
        /// <summary>
        /// Plays an animation with specified animation data.
        /// </summary>
        /// <param name="data">animation data</param>
        public void PlayAnimation(T2DAnimationData data)
        {
            // replace the current animation data with the one specified
            AnimationData = data;

            // begin the new animation
            PlayAnimation();
        }
            /// <summary>
            /// Adds a sound event to the specified frame of the specified animation.
            /// </summary>
            /// <param name="animation">The animation to add the step sound to.</param>
            /// <param name="frameIndex">The 0-based frame number of the specified animation on which to play the specified sound cue.</param>
            /// <param name="soundCueIndex">The sound cue to play on the specified frame of the specified animation.</param>
            public void AddStepSoundFrame(T2DAnimationData animation, int frameIndex, string soundCueIndex)
            {
                if (animation == null)
                    return;

                if (!_stepSoundAnimations.Contains(animation.Name))
                    _stepSoundAnimations.Add(animation.Name, new StepSoundTable(animation));

                StepSoundTable table = _stepSoundAnimations[animation.Name] as StepSoundTable;

                if (table != null)
                    table.AddStepFrame(frameIndex, soundCueIndex);
                else
                    ClearAnimationStepSounds(animation);
            }
            /// <summary>
            /// Plays the specified animation on the Actor starting at the specified frame. Also responsible for playing sound events.
            /// </summary>
            /// <param name="animation">The animation to be played.</param>
            /// <param name="frameIndex">The frame at which to start the animation.</param>
            protected virtual void _playAnimation(T2DAnimationData animation, uint frameIndex)
            {
                // make sure the animation exists
                // (and that we actually have an actor component)
                if (_actorComponent != null && animation != null)
                {
                    uint targetFrame = frameIndex < animation.AnimationFramesList.Count ? frameIndex : 0;
                    _actorComponent._animatedSprite.PlayAnimation(animation);
                    _actorComponent._animatedSprite.SetAnimationFrame(targetFrame);

                    // if we're currently supposed to be managing sound events for this actor...
                    if (_actorComponent._useAnimationManagerSoundEvents)
                    {
                        // grab the sound event for this animation
                        string soundEvent = GetSoundEvent(animation);

                        // play the sound event if one exists
                        if (soundEvent != null)
                        {
                            float distance = Vector2.Distance((_actorComponent.SceneObject.SceneGraph.Camera as T2DSceneCamera).Position, _actorComponent._animatedSprite.Position);
                            _currentSoundCue = SoundManager.Instance.PlaySound(_actorComponent._soundBank, soundEvent, distance);
                        }
                    }

                    // if we're supposed to be doing step sounds...
                    if (_actorComponent._useAnimationStepSoundList)
                    {
                        // grab the sound table for this animation
                        StepSoundTable table = GetStepSoundTable(animation);

                        // table has frames, enable OnFrameChange callback
                        if (table != null && table.HasFrames)
                        {
                            _actorComponent._animatedSprite.OnFrameChange = OnFrameChange;

                            // special case: check for step sound on starting frame and play
                            if (table.StepSounds.Contains(frameIndex) && table.Enabled)
                            {
                                float distance = Vector2.Distance((_actorComponent.SceneObject.SceneGraph.Camera as T2DSceneCamera).Position, _actorComponent._animatedSprite.Position);
                                _currentSoundCue = SoundManager.Instance.PlaySound(_actorComponent._soundBank,
                                                                table.StepSounds[frameIndex] as string,
                                                                distance);
                            }
                        }
                    }
                }
            }
            /// <summary>
            /// Set a sound cue to be played immediately when the specified animation is played.
            /// </summary>
            /// <param name="animation">The animation to attach the sound cue to.</param>
            /// <param name="soundCueIndex">The name of the sound cue.</param>
            public void SetSoundEvent(T2DAnimationData animation, string soundCueIndex)
            {
                if (animation == null)
                    return;

                ClearSoundEvent(animation);

                _soundEvents.Add(animation.Name, soundCueIndex);
            }
            /// <summary>
            /// Add a transitional animation to be played between the two specified animation states.
            /// </summary>
            /// <param name="from">The name of the state to be transitioning from.</param>
            /// <param name="to">The name of the state to be transitioning to.</param>
            /// <param name="animationData">The animation to be played when transitioning from FromState to ToState.</param>
            public void SetTransition(string from, string to, T2DAnimationData animationData)
            {
                if (animationData == null)
                    return;

                Assert.Fatal(!animationData.AnimationCycle, "Transitional animations should not cycle! \n\nDo not add looping animations to an Actor's transition list.");

                ClearTransition(from, to);

                string hashKey = from + "_to_" + to;
                _transitions.Add(hashKey, animationData);
            }
            /// <summary>
            /// Get the sound cue to be played when the specified animation is played.
            /// </summary>
            /// <param name="animation">The animation to check for.</param>
            /// <returns>The sound cue associated with the specified animation.</returns>
            public string GetSoundEvent(T2DAnimationData animation)
            {
                if (_soundEvents.Contains(animation.Name))
                    return _soundEvents[animation.Name] as string;

                return null;
            }
            /// <summary>
            /// Get the step sound table associated with the specified animation.
            /// </summary>
            /// <param name="animation">The animation for which to retrieve the step sound table.</param>
            /// <returns>The step sound table associated with the specified animation.</returns>
            public StepSoundTable GetStepSoundTable(T2DAnimationData animation)
            {
                if (_stepSoundAnimations.Contains(animation.Name))
                    return _stepSoundAnimations[animation.Name] as StepSoundTable;

                return null;
            }
            /// <summary>
            /// Remove any sound event from the specified frame of the specified animation.
            /// </summary>
            /// <param name="animation">The animation to remove the sound event from.</param>
            /// <param name="frame">The frame to remove the sound event from.</param>
            public void ClearStepSoundFrame(T2DAnimationData animation, int frame)
            {
                if (_stepSoundAnimations.Contains(animation.Name))
                {
                    StepSoundTable table = _stepSoundAnimations[animation.Name] as StepSoundTable;

                    if (table != null)
                        table.RemoveStepFrame(frame);
                    else
                        ClearAnimationStepSounds(animation);
                }
            }
 /// <summary>
 /// Remove a sound event from the specified animation.
 /// </summary>
 /// <param name="animation">The animation to clear the sound event from.</param>
 public void ClearSoundEvent(T2DAnimationData animation)
 {
     if (_soundEvents.Contains(animation.Name))
         _soundEvents.Remove(animation.Name);
 }
            /// <summary>
            /// Removes all step sounds from the specified animation.
            /// </summary>
            /// <param name="animation">The animation to clear step sounds from.</param>
            public void ClearAnimationStepSounds(T2DAnimationData animation)
            {
                if (_stepSoundAnimations.Contains(animation.Name))
                {
                    StepSoundTable table = _stepSoundAnimations[animation.Name] as StepSoundTable;

                    if (table != null)
                        table.ClearTable();

                    _stepSoundAnimations.Remove(animation.Name);
                }
            }
 public T2DAnimatedSprite(T2DAnimationData _data)
     : this()
 {
     // record the specified animation data
     AnimationData = _data;
 }
 /// <summary>
 /// Plays the specified animation on the Actor starting at frame 0. Also responsible for playing sound events.
 /// </summary>
 /// <param name="animation">The animation to be played.</param>
 protected virtual void _playAnimation(T2DAnimationData animation)
 {
     _playAnimation(animation, 0);
 }
 public T2DAnimationCue(T2DAnimationData animationData, float cueTime)
 {
     _animationData = animationData;
     _restoreTime = cueTime;
 }
 /// <summary>
 /// Constructor. Records the animation this tabls is associated with.
 /// </summary>
 /// <param name="animation"></param>
 public StepSoundTable(T2DAnimationData animation)
 {
     _animation = animation;
 }