// Project: XnaShooter, File: TextureFont.cs
// Namespace: XnaShooter.Graphics, Class: TextureFont
// Path: C:\code\XnaShooter\Graphics, Author: Abi
// Code lines: 380, Size of file: 10,76 KB
// Creation date: 31.08.2006 19:47
// Last modified: 18.09.2006 22:11
// Generated with Commenter by abi.exDream.com
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
using XnaShooter.Game;
using XnaShooter.Helpers;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
#endregion
namespace XnaShooter.Graphics
{
///
/// Texture font
///
public class NumbersTextureFont : IGraphicContent
{
#region Constants
///
/// Smaller numbers in the NumbersFont.png graphic
///
private static readonly Rectangle[] SmallNumberRects =
{
// 0
new Rectangle(0, 0, 25, 36),
// 1
new Rectangle(26, 0, 20, 36),
// 2
new Rectangle(48, 0, 24, 36),
// 3
new Rectangle(72, 0, 24, 36),
// 4
new Rectangle(96, 0, 25, 36),
// 5
new Rectangle(121, 0, 23, 36),
// 6
new Rectangle(144, 0, 25, 36),
// 7
new Rectangle(169, 0, 23, 36),
// 8
new Rectangle(192, 0, 24, 36),
// 9
new Rectangle(216, 0, 24, 36),
// :
new Rectangle(240, 0, 15, 36),
};
#endregion
#region Variables
///
/// Texture for rendering all these fonts
///
private Texture fontTexture = null;
///
/// Font texture name
///
string fontTextureName = "";
#endregion
#region Constructor
///
/// Create texture font
///
public NumbersTextureFont(string setFontTextureName)
{
fontTextureName = setFontTextureName;
Load();
BaseGame.RegisterGraphicContentObject(this);
} // NumbersTextureFont(setFontTexture)
#endregion
#region Load
///
/// Load the font, also used for reloading.
///
public void Load()
{
if (fontTexture == null)
fontTexture = new Texture(fontTextureName);
} // Load()
#endregion
#region Dispose
///
/// Dispose
///
public void Dispose()
{
if (fontTexture != null)
fontTexture.Dispose();
fontTexture = null;
} // Dispose()
#endregion
#region Write number
///
/// Write digit
///
/// X
/// Y
/// Gfx rects
/// Int
private int WriteDigit(int x, int y, int digit, Rectangle[] gfxRects)
{
float resScalingX = 0.725f * (float)BaseGame.Width / 1024.0f;
float resScalingY = 0.725f * (float)BaseGame.Height / 768.0f;
Rectangle rect = gfxRects[digit % gfxRects.Length];
fontTexture.RenderOnScreen(new Rectangle(x, y,
(int)Math.Round(rect.Width * resScalingX),
(int)Math.Round(rect.Height * resScalingY)), rect);
return (int)Math.Round((rect.Width - 4) * resScalingX);
} // WriteDigit(x, y, digit)
///
/// Write digit
///
/// X
/// Y
/// Digit
/// Gfx rects
/// Alpha
/// Int
private int WriteDigit(int x, int y, int digit, Rectangle[] gfxRects,
float alpha)
{
float resScalingX = 0.725f * (float)BaseGame.Width / 1024.0f;
float resScalingY = 0.725f * (float)BaseGame.Height / 768.0f;
Rectangle rect = gfxRects[digit % gfxRects.Length];
fontTexture.RenderOnScreen(new Rectangle(x, y,
(int)Math.Round(rect.Width * resScalingX),
(int)Math.Round(rect.Height * resScalingY)), rect,
Color.White, alpha);
return (int)Math.Round((rect.Width-4) * resScalingX);
} // WriteDigit(x, y, digit)
///
/// Write number
///
/// X
/// Y
/// Number
/// Gfx rects
/// Int
private int WriteNumber(int x, int y, int number, Rectangle[] gfxRects)
{
// Convert to string
string numberText = number.ToString();
int width = 0;
// And now process every letter
foreach (char numberChar in numberText.ToCharArray())
{
width += WriteDigit(x + width, y, (int)numberChar - (int)'0', gfxRects);
} // foreach (numberChar)
return width;
} // WriteNumber(x, y, number)
///
/// Write number
///
/// X
/// Y
/// Number
/// Gfx rects
/// Alpha
/// Int
private int WriteNumber(int x, int y, int number, Rectangle[] gfxRects,
float alpha)
{
// Convert to string
string numberText = number.ToString();
int width = 0;
// And now process every letter
foreach (char numberChar in numberText.ToCharArray())
{
width += WriteDigit(
x + width, y, (int)numberChar - (int)'0', gfxRects, alpha);
} // foreach (numberChar)
return width;
} // WriteNumber(x, y, number)
///
/// Write number
///
/// X
/// Y
/// Number
public void WriteNumber(int x, int y, int number)
{
WriteNumber(x, y, number, SmallNumberRects);
} // WriteSmallNumber(x, y, number)
///
/// Write number centered
///
/// X
/// Y
/// Number
public void WriteNumberCentered(int x, int y, int number)
{
float resScalingY = 0.725f * (float)BaseGame.Height / 768.0f;
WriteNumber(x - (int)(resScalingY *
(number.ToString().Length * SmallNumberRects[0].Width / 2)),
y, number, SmallNumberRects);
} // WriteSmallNumberCentered(x, y, number)
///
/// Write number centered
///
/// X
/// Y
/// Number
/// Alpha
public void WriteNumberCentered(int x, int y, int number, float alpha)
{
float resScalingY = 0.725f * (float)BaseGame.Height / 768.0f;
WriteNumber(x - (int)(resScalingY *
number.ToString().Length * SmallNumberRects[0].Width / 2),
y, number, SmallNumberRects, alpha);
} // WriteNumberCentered(x, y, number)
#endregion
#region Write time
///
/// Write time
///
/// X
/// Y
/// Minutes
/// Seconds
public void WriteTime(int x, int y, int minutes, int seconds)
{
// Start with minutes
int minuteWidth = WriteNumber(x, y, minutes, SmallNumberRects);
// Show : in the middle
minuteWidth += WriteDigit(x + minuteWidth, y,
SmallNumberRects.Length - 1, SmallNumberRects);
// Add a zero if we got 0-9 seconds
if (seconds < 10)
minuteWidth += WriteDigit(x + minuteWidth, y, 0, SmallNumberRects);
// And now add seconds
WriteNumber(x + minuteWidth, y, seconds, SmallNumberRects);
} // WriteTime(x, y, minutes)
///
/// Write time
///
/// X
/// Y
/// Time in ms
public void WriteTime(int x, int y, int timeMs)
{
int minutes = (int)(timeMs / 1000) / 60;
int seconds = (int)(timeMs / 1000) % 60;
WriteTime(x, y, minutes, seconds);
} // WriteTime(x, y, timeMs)
#endregion
#region Unit Testing
#if DEBUG
///
/// Test write numbers
///
public static void TestWriteNumbers()
{
NumbersTextureFont textureFont = null;
TestGame.Start(
"TestWriteNumbers",
delegate
{
textureFont = new NumbersTextureFont("NumbersFont");
},
delegate
{
BaseGame.EnableAlphaBlending();
textureFont.WriteNumber(100, 100, 123);
textureFont.WriteNumberCentered(100, 200, 123);
textureFont.WriteNumberCentered(100, 250, 123);
textureFont.WriteTime(250, 250, (int)BaseGame.TotalTimeMs);
});
} // TestWriteNumbers()
#endif
#endregion
} // class NumbersTextureFont
} // namespace XnaShooter.Graphics