/// <summary> /// Begins or continues playback of an animation. /// </summary> public void PlayAnimation(List<Sequence> lsequence, StateElement stateElement) { StatePlayerElement statePlayerElement = default(StatePlayerElement); StateTileElement stateTileElement = default(StateTileElement); string stateName = string.Empty; if (object.ReferenceEquals(typeof(StatePlayerElement), stateElement.GetType())) { statePlayerElement = (StatePlayerElement)stateElement; stateName = statePlayerElement.state.ToString(); StateName = stateName; } else if (object.ReferenceEquals(typeof(StateTileElement), stateElement.GetType())) { stateTileElement = (StateTileElement)stateElement; stateName = stateTileElement.state.ToString(); StateName = stateName; } else { stateName = stateElement.state.ToString(); StateName = stateName; } // Start the new animation. if (stateElement.Priority == Enumeration.PriorityState.Normal & this.IsStoppable == false) { return; } //Check if the animation is already playing if (sequence != null && sequence.name == stateName) { return; } this.lsequence = lsequence; //Search in the sequence the right type Sequence result = lsequence.Find((Sequence s) => s.name == stateName.ToUpper()); if (result == null) { //will be an error return; } //cloning for avoid reverse pemanently... sequence = result; if (stateElement.Stoppable != null) { foreach (Frame f in sequence.frames) { f.stoppable = Convert.ToBoolean(stateElement.Stoppable); } } //For increase offset depend of the state previus; for example when running and fall the x offset will be increase. if (stateElement.OffSet != Vector2.Zero) { foreach (Frame f in sequence.frames) { f.xOffSet = f.xOffSet + Convert.ToInt32(Math.Truncate(stateElement.OffSet.X)); f.yOffSet = f.yOffSet + Convert.ToInt32(Math.Truncate(stateElement.OffSet.Y)); } } //Check if reverse movement and reverse order and sign x,y if (stateElement.Reverse == Enumeration.SequenceReverse.Reverse) { List<Frame> newListFrame = new List<Frame>(); List<Frame> newListCommand = new List<Frame>(); foreach (Frame f in sequence.frames) { if (f.type == Enumeration.TypeFrame.COMMAND) { newListCommand.Add(f); } else { f.xOffSet = -1 * f.xOffSet; f.yOffSet = -1 * f.yOffSet; newListFrame.Add(f); } } newListFrame.Reverse(); //add command foreach (Frame f in newListCommand) { newListFrame.Add(f); } sequence.frames = newListFrame; } if (stateElement.Reverse == Enumeration.SequenceReverse.FixFrame) { this.m_frameIndex = this.FrameSpriteCount() - this.m_frameIndex; } else { this.m_frameIndex = 0; } this.firstTime = true; }
/// <summary> /// Begins or continues playback of an animation. /// </summary> public void PlayAnimation(List <Sequence> lsequence, StateElement stateElement) { StatePlayerElement statePlayerElement = default(StatePlayerElement); StateTileElement stateTileElement = default(StateTileElement); string stateName = string.Empty; if (object.ReferenceEquals(typeof(StatePlayerElement), stateElement.GetType())) { statePlayerElement = (StatePlayerElement)stateElement; stateName = statePlayerElement.state.ToString(); StateName = stateName; } else if (object.ReferenceEquals(typeof(StateTileElement), stateElement.GetType())) { stateTileElement = (StateTileElement)stateElement; stateName = stateTileElement.state.ToString(); StateName = stateName; } else { stateName = stateElement.state.ToString(); StateName = stateName; } // Start the new animation. if (stateElement.Priority == Enumeration.PriorityState.Normal & this.IsStoppable == false) { return; } //Check if the animation is already playing if (sequence != null && sequence.name == stateName) { return; } this.lsequence = lsequence; //Search in the sequence the right type Sequence result = lsequence.Find((Sequence s) => s.name == stateName.ToUpper()); if (result == null) { //will be an error return; } //cloning for avoid reverse pemanently... sequence = result; if (stateElement.Stoppable != null) { foreach (Frame f in sequence.frames) { f.stoppable = Convert.ToBoolean(stateElement.Stoppable); } } //For increase offset depend of the state previus; for example when running and fall the x offset will be increase. if (stateElement.OffSet != Vector2.Zero) { foreach (Frame f in sequence.frames) { f.xOffSet = f.xOffSet + Convert.ToInt32(Math.Truncate(stateElement.OffSet.X)); f.yOffSet = f.yOffSet + Convert.ToInt32(Math.Truncate(stateElement.OffSet.Y)); } } //Check if reverse movement and reverse order and sign x,y if (stateElement.Reverse == Enumeration.SequenceReverse.Reverse) { List <Frame> newListFrame = new List <Frame>(); List <Frame> newListCommand = new List <Frame>(); foreach (Frame f in sequence.frames) { if (f.type == Enumeration.TypeFrame.COMMAND) { newListCommand.Add(f); } else { f.xOffSet = -1 * f.xOffSet; f.yOffSet = -1 * f.yOffSet; newListFrame.Add(f); } } newListFrame.Reverse(); //add command foreach (Frame f in newListCommand) { newListFrame.Add(f); } sequence.frames = newListFrame; } if (stateElement.Reverse == Enumeration.SequenceReverse.FixFrame) { this.m_frameIndex = this.FrameSpriteCount() - this.m_frameIndex; } else { this.m_frameIndex = 0; } this.firstTime = true; }