using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace ShootEmUp.Animations { class Animation { public Texture2D GetSpriteSheet { get; } public Rectangle GetSourceRectangle { get; set; } public Point GetSpriteCount { get; private set; } private Point mySpriteSize; private float myElapsedTime; private float myTimeBetweenFrames; public Animation(Texture2D aSpriteSheet, Point someSpriteSize, Point someSpriteCount, float someTimeBetweenFrames) { GetSpriteSheet = aSpriteSheet; mySpriteSize = someSpriteSize; GetSpriteCount = someSpriteCount; myTimeBetweenFrames = someTimeBetweenFrames; } public void Update(GameTime someGameTime) { if (GetSpriteCount.X * GetSpriteCount.Y == 1) { GetSourceRectangle = new Rectangle(0, 0, mySpriteSize.X, mySpriteSize.Y); return; } int tempTargetSpriteIndex = GetTargetSpriteIndex(someGameTime); Point tempTargetImage = GetTargetImage(tempTargetSpriteIndex); Point tempTargetImagePosition = new Point(tempTargetImage.X * mySpriteSize.X, tempTargetImage.Y * mySpriteSize.Y); Rectangle tempTargetRectangle = new Rectangle(tempTargetImagePosition.X, tempTargetImagePosition.Y, mySpriteSize.X, mySpriteSize.Y); GetSourceRectangle = tempTargetRectangle; } private int GetTargetSpriteIndex(GameTime someGameTime) { int tempTargetSpriteIndex = 0; do { tempTargetSpriteIndex = (int)(myElapsedTime / (myTimeBetweenFrames <= 0 ? 1 : myTimeBetweenFrames)); myElapsedTime += (float)someGameTime.ElapsedGameTime.TotalSeconds; if (tempTargetSpriteIndex >= GetSpriteCount.X * GetSpriteCount.Y) { myElapsedTime = 0; } } while (tempTargetSpriteIndex >= GetSpriteCount.X * GetSpriteCount.Y); return tempTargetSpriteIndex; } private Point GetTargetImage(int someTargetSpriteIndex) { return new Point(someTargetSpriteIndex % GetSpriteCount.X, (int)(someTargetSpriteIndex / GetSpriteCount.X)); } } }