Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

Difficulties with Animations:ArgumentOutOfRangeException was unhandled

$
0
0
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);
        }
 }     

Viewing all articles
Browse latest Browse all 51036

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>