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.