SpriteSheet Class

I’ve been talking with a guy on the creator forums lately about SpriteSheets and so I decided it might be a good idea to post my SpriteSheet class.

It’s very simple. Only reads sprites from left to right and assumes all Sprites are the same width and height.

#region Using
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
#endregion

namespace Snow.Xna.Graphics
{
	/// 
	/// Spritesheet class.
	/// 
	public class SpriteSheet
	{
		#region Fields

		string name;

		Texture2D texture;

		Rectangle[] rectangles;

		int spriteWidth, spriteHeight;

		#endregion

		#region Properties

		/// 
		/// The name of this SpriteSheet.
		/// 
		public string Name
		{
			get { return name; }
		}

		/// 
		/// The texture for this SpriteSheet.
		/// 
		public Texture2D Texture
		{
			get { return texture; }
		}

		/// 
		/// Returns a rectangle for a sprite in the SpriteSheet.
		/// 
		/// index
		/// 
		public Rectangle this[int i]
		{
			get { return rectangles[i]; }
		}

		/// 
		/// The number of sprites in this SpriteSheet.
		/// 
		public int Count
		{
			get { return rectangles.Length; }
		}

		/// 
		/// The width of the texture.
		/// 
		public int Width
		{
			get { return texture.Width; }
		}

		/// 
		/// The width of each sprite in the SpriteSheet.
		/// 
		public int SpriteWidth
		{
			get { return spriteWidth; }
		}

		/// 
		/// The height of the texture.
		/// 
		public int Height
		{
			get { return texture.Height; }
		}

		/// 
		/// The height of each sprite in the SpriteSheet.
		/// 
		public int SpriteHeight
		{
			get { return spriteHeight; }
		}

		#endregion

		/// 
		/// Create a new SpriteSheet and determine the number of sprites in the sheet.
		/// 
		/// 
		/// Width of each sprite.
		/// Height of each sprite.
		public SpriteSheet(string name, Texture2D texture, int spriteWidth, int spriteHeight)
			: this(name, texture, spriteWidth, spriteHeight, 0)
		{
		}

		/// 
		/// Create a new SpriteSheet.
		/// 
		/// 
		/// Width of each sprite.
		/// Height of each sprite.
		/// The number of sprites in the sheet.
		public SpriteSheet(string name, Texture2D texture, int spriteWidth, int spriteHeight, int count)
		{
			this.name = name;
			this.texture = texture;
			this.spriteWidth = spriteWidth;
			this.spriteHeight = spriteHeight;

			if(count == 0)
			{
				int numX = texture.Width / spriteWidth;
				int numY = texture.Height / spriteHeight;

				rectangles = new Rectangle[numX * numY];
			}
			else
			{
				rectangles = new Rectangle[count];
			}

			int x = 0, y = 0;
			for(int i = 0; i < rectangles.Length; i++)
			{
				rectangles[i] = new Rectangle(x, y, spriteWidth, spriteHeight);

				x += spriteWidth;
				if(x >= texture.Width)
				{
					x = 0;
					y += spriteHeight;
				}
			}
		}

		public static implicit operator Texture2D(SpriteSheet spriteSheet)
		{
			return spriteSheet.Texture;
		}
	}
}

You can create a new SpriteSheet and use it like this:

SpriteSheet spriteSheet = new SpriteSheet("tiles", Content.Load("tiles"), 64, 64);

spriteBatch.Begin();

spriteBatch.Draw(spriteSheet,
		        new Rectangle(0, 0, spriteSheet.SpriteWidth, spriteSheet.SpriteHeight),
			spriteSheet[0],
			Color.White);

spriteBatch.End();

Which loads a spritesheet with sprites of size 64×64. It then draws the first Sprite in the SpriteSheet. You of course wouldn’t want to load the spritesheet every frame as well.

Feel free to use this code without restriction.

Edit: I copied and pasted the second piece of code from somewhere else so I fixed two typos.

  • ericnel

    Nice new blog. Favor to ask. I am new to WordPress as well and I’m trying to figure out how to do code snippet insertion into posts, I use Live Writer and the code snippet addin in Live Writer just ends up as displayed HTML codes. I also can not see how to do it using the WordPress web tools. How do you do it?

    Similarly – would be nice to include my Xbox live gametag. How did you get that displayed. (Less important than the code snippets)

    Enjoy Germany.

  • smack0007

    Use the tag [ sourcecode language="c#"]…[/sourcecode] without the space before the s tag to post source code to your pages.

    Use http://www.mygamercard.net to get your gamertag as an image and put it inside a widget on your theme.

  • ericnel

    Thanks – much appreciated.