Posts Tagged 'SpriteSheet'

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.