topical media & game development
game-xna-intro-XnaTetris-Helpers-SpriteHelper.cs / cs
// Project: XnaTetris, File: SpriteHelper.cs
// Namespace: XnaTetris.Helpers, Class: SpriteHelper
// Path: C:\code\XnaTetris\Helpers, Author: Abi
// Code lines: 62, Size of file: 2,14 KB
// Creation date: 13.10.2006 23:14
// Last modified: 20.10.2006 08:29
// Generated with Commenter by abi.exDream.com
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
#endregion
namespace XnaTetris.Helpers
{
<summary>
Sprite helper class to manage and render sprites.
</summary>
public class SpriteHelper
{
#region SpriteToRender helper class
class SpriteToRender
{
public Texture2D texture;
public Rectangle rect;
public Rectangle? sourceRect;
public
Color color;
public SpriteToRender(Texture2D setTexture, Rectangle setRect,
Rectangle? setSourceRect, Color setColor)
{
texture = setTexture;
rect = setRect;
sourceRect = setSourceRect;
color = setColor;
} // SpriteToRender(setTexture, setRect, setColor)
} // SpriteToRender
#endregion
#region Variables
<summary>
Keep a list of all sprites we have to render this frame.
</summary>
static List<SpriteToRender> sprites =
new List<SpriteToRender>();
<summary>
Sprite batch for rendering
</summary>
static SpriteBatch spriteBatch = null;
<summary>
Texture for this sprite
</summary>
Texture2D texture;
<summary>
Graphic rectangle used for this sprite inside the texture.
Can be null to use the whole texture.
</summary>
Rectangle gfxRect;
#endregion
#region Constructor
public SpriteHelper(Texture2D setTexture, Rectangle? setGfxRect)
{
texture = setTexture;
if (setGfxRect == null)
gfxRect = new Rectangle(0, 0, texture.Width, texture.Height);
else
gfxRect = setGfxRect.Value;
} // SpriteHelper(setTexture, setGfxRect)
#endregion
#region Dispose
<summary>
Dispose the static spriteBatch and sprites helpers in case
the device gets lost.
</summary>
public static void Dispose()
{
sprites.Clear();
if (spriteBatch != null)
spriteBatch.Dispose();
spriteBatch = null;
} // Dispose()
#endregion
#region RenderSprite
public void Render(Rectangle rect, Color color)
{
sprites.Add(new SpriteToRender(texture, rect, gfxRect, color));
} // Render(texture, rect, sourceRect, color)
public void Render(Rectangle rect)
{
Render(rect, Color.White);
} // Render(texture, rect, sourceRect)
public void Render(int x, int y, Color color)
{
Render(new Rectangle(x, y, gfxRect.Width, gfxRect.Height), color);
} // Render(texture, rect, sourceRect)
public void Render(int x, int y)
{
Render(new Rectangle(x, y, gfxRect.Width, gfxRect.Height));
} // Render(texture, rect, sourceRect)
public void Render()
{
Render(new Rectangle(0, 0, 1024, 768));
} // Render(texture)
public void RenderCentered(float x, float y, float scale)
{
Render(new Rectangle(
(int)(x * 1024 - scale * gfxRect.Width/2),
(int)(y * 768 - scale * gfxRect.Height/2),
(int)(scale * gfxRect.Width),
(int)(scale * gfxRect.Height)));
} // RenderCentered(x, y)
public void RenderCentered(float x, float y)
{
RenderCentered(x, y, 1);
} // RenderCentered(x, y)
public void RenderCentered(Vector2 pos)
{
RenderCentered(pos.X, pos.Y);
} // RenderCentered(pos)
#endregion
#region DrawSprites
public static void DrawSprites(int width, int height)
{
// No need to render if we got no sprites this frame
if (sprites.Count == 0)
return;
// Create sprite batch if we have not done it yet.
// Use device from texture to create the sprite batch.
if (spriteBatch == null)
spriteBatch = new SpriteBatch(sprites[0].texture.GraphicsDevice);
Texture2D lastSpriteTexture = null;
bool spriteBatchStarted = false;
// Render all sprites
foreach (SpriteToRender sprite in sprites)
{
// Start rendering sprites
// Note: Now moved inside loop to fix most render sorting errors!
if (lastSpriteTexture != sprite.texture)
{
if (spriteBatchStarted)
spriteBatch.End();
spriteBatchStarted = true;
spriteBatch.Begin(SpriteBlendMode.AlphaBlend,
SpriteSortMode.BackToFront, SaveStateMode.None);
} // if
spriteBatch.Draw(sprite.texture,
// Rescale to fit resolution
new Rectangle(
sprite.rect.X * width / 1024,
sprite.rect.Y * height / 768,
sprite.rect.Width * width / 1024,
sprite.rect.Height * height / 768),
sprite.sourceRect, sprite.color);
} // foreach
// We are done, draw everything on screen with help of the end method.
if (spriteBatchStarted)
spriteBatch.End();
// Kill list of remembered sprites
sprites.Clear();
} // DrawSprites()
#endregion
} // class SpriteHelper
} // namespace XnaTetris
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.