I wrote a class to play my animations. But it just works if I play the entire animation. For example: If my spritesheet has 3 pictures, I call the Animation class like that to play the entire animation :
Player_Animation = new Animation(new List<Rectangle>(3), Content.Load<Texture2D>("walking"), TimeSpan.FromSeconds(1), Animation.Sequences.forwards, this, 0, 3);
That works.
But on the other hand: If my spritesheet has 3 pictures, and if I just want the first 2 pictures of the animation, I call the Animation class like this to play only the first 2 pictures of the animation:
Player_Animation = new Animation(new List<Rectangle>(3), Content.Load<Texture2D>("walking"), TimeSpan.FromSeconds(1), Animation.Sequences.forwards, this, 0, 2);
That doesn't work. I always get that "ArgumentOutOfRangeException was unhandled" error message in the following line(it's the last line of the Animation class):
batch.Draw(Texture, new Rectangle((int)PositionX, (int)PositionY, Texture.Width / SourceRects.Capacity, Texture.Height), SourceRects[_animIndex], Color.White,0,new Vector2(Texture.Width/2, Texture.Height/2),Flip,1);
What is wrong? Why can't I play an interval of the animation without getting that error message? Here's my Animation class:
public class Animation
{
public SpriteEffects Flip;
private Game1 game1;
private int _animIndex, numberofsourceRects, framewidth, frameheight;
private TimeSpan PassedTime;
private List<Rectangle> SourceRects;
private Texture2D Texture;
private TimeSpan Duration;
private Sequences Sequence;
public enum Sequences
{
forwards, backwards, forwards_backwards, backwards_forwards
}
private void forwards(List<Rectangle> sourceRects, int framewidth, int frameheight, int start, int end)
{
numberofsourceRects = end;
for (int i = start; i < numberofsourceRects; i++)
sourceRects.Add(new Rectangle(i * framewidth, 0, framewidth, frameheight));
}
private void backwards(List<Rectangle> sourceRects, int framewidth, int frameheight, int start, int end)
{
numberofsourceRects = end;
for (int i = start; i < numberofsourceRects; i++)
sourceRects.Add(new Rectangle((numberofsourceRects - 1 - i) * framewidth, 0, framewidth, frameheight));
}
private void forwards_backwards(List<Rectangle> sourceRects, int framewidth, int frameheight, int start, int end)
{
numberofsourceRects = end;
for (int i = start; i < numberofsourceRects; i++)
sourceRects.Add(new Rectangle(i * framewidth, 0, framewidth, frameheight));
for (int i = start; i < numberofsourceRects; i++)
sourceRects.Add(new Rectangle((numberofsourceRects - 1 - i) * framewidth, 0, framewidth, frameheight));
}
private void backwards_forwards(List<Rectangle> sourceRects, int framewidth, int frameheight, int start, int end)
{
numberofsourceRects = end;
for (int i = start; i < numberofsourceRects; i++)
sourceRects.Add(new Rectangle((numberofsourceRects - 1 - i) * framewidth, 0, framewidth, frameheight));
for (int i = start; i < numberofsourceRects; i++)
sourceRects.Add(new Rectangle(i * framewidth, 0, framewidth, frameheight));
}
public Animation(List<Rectangle> sourceRects, Texture2D texture, TimeSpan duration, Sequences sequences, Game1 game, int start_interval, int end_interval)
{
game1 = game;
numberofsourceRects = sourceRects.Capacity;
framewidth = texture.Width / numberofsourceRects;
frameheight = texture.Height;
switch (sequences)
{
case Sequences.forwards:
{
forwards(sourceRects,framewidth,frameheight, start_interval, end_interval);
break;
}
case Sequences.backwards:
{
backwards(sourceRects, framewidth, frameheight, start_interval, end_interval);
break;
}
case Sequences.forwards_backwards:
{
forwards_backwards(sourceRects, framewidth, frameheight, start_interval, end_interval);
break;
}
case Sequences.backwards_forwards:
{
backwards_forwards(sourceRects, framewidth, frameheight, start_interval, end_interval);
break;
}
}
SourceRects = sourceRects;
Texture = texture;
Duration = duration;
Sequence = sequences;
}
public void Update(GameTime dt)
{
PassedTime += dt.ElapsedGameTime;
if (PassedTime > Duration)
{
PassedTime -= Duration;
}
var percent = PassedTime.TotalSeconds / Duration.TotalSeconds;
_animIndex = (int)Math.Round(percent * (SourceRects.Capacity -1));
}
public void Draw(SpriteBatch batch, float PositionX, float PositionY)
{
numberofsourceRects = SourceRects.Capacity /2;
if ((Sequence == Sequences.forwards_backwards) || (Sequence == Sequences.backwards_forwards))
batch.Draw(Texture, new Rectangle((int)PositionX, (int)PositionY, Texture.Width / numberofsourceRects, Texture.Height), SourceRects[_animIndex], Color.White,0,new Vector2(Texture.Width/2, Texture.Height/2),Flip,1);
else
batch.Draw(Texture, new Rectangle((int)PositionX, (int)PositionY, Texture.Width / SourceRects.Capacity, Texture.Height), SourceRects[_animIndex], Color.White,0,new Vector2(Texture.Width/2, Texture.Height/2),Flip,1);
}
}