XNA 批处理文本输出






4.58/5 (6投票s)
2007 年 7 月 2 日
3分钟阅读

47227

284
一个批量文本输出组件,用于调试 XNA 项目。
引言
注意:这将是 XNA 入门系列文章的第一篇。
当启动一个 XNA 项目时,您会很快发现困难的事情很容易,而容易的事情却很难。您要做的第一件事就是输出一些文本。这里介绍的 TextOutput 组件是一个 XNA 可绘制组件,可以高效地批量输出文本。它主要用于调试辅助工具。
背景
XNA 是一组软件工具,可以使游戏和多媒体应用程序的开发变得更加容易。 XNA 构建于 .NET 2.0 Framework 之上,但它包含自己的环境和其他库。目前,XNA 官方仅支持 C#,但从技术上讲,任何 .NET 语言都应该可以在其下工作。 最棒的是,为 XNA 编写的程序可以编译为在 Windows 和 XBox-360 下运行。
- 您可以从 Microsoft 此处获取最新的 XNA Game Studio Express。
- 您还需要 Microsoft 的 Visual C# Express。(您可以在 VS 的专业版中创建 XNA 项目,但您仍然需要 Express 来安装 Express 并编译一些内容。)
信不信由你,XNA 的前几个版本根本没有内置对显示文本的支持。开发社区迅速提出了几种解决方案。但是,其中大多数都涉及运行单独的程序将您自己的字体编译为位图,将该位图文件复制到您的项目中,然后使用一个库将该位图加载到 spriteBatch 中,以便将其渲染到屏幕上。幸运的是,Microsoft 决定在最新版本的 XNA 中包含一个内置解决方案,该解决方案通过让 XNA 的内置内容管理系统自动转换字体来简化操作。
安装最新的 XNA GSE 后,您可以转到“帮助”以了解如何在屏幕上绘制文本。 在当前版本中,它位于
“帮助:目录:XNA Game Studio Express:编程指南:操作:绘制文本。”
该帮助中的代码示例是
ForegroundBatch.Begin();
// Draw Hello World
string output = "Hello World";
// Find the center of the string
Vector2 FontOrigin = CourierNew.MeasureString( output ) / 2;
// Draw the string
ForegroundBatch.DrawString( CourierNew, output, FontPos, Color.LightGreen,
FontRotation, FontOrigin, 1.0f, SpriteEffects.None, 0.5f );
...
ForegroundBatch.End();
这还不错,但是有点麻烦。 此外,多次调用 sprite batch 可能会很慢。
使用代码
要使用 TextOutput
组件,请将 TextOutput.cs 文件添加到您的项目中。 请注意,您还需要创建一个名为 Arial.SpriteFont 的文件(只需从示例项目中复制它)。
将 using 语句添加到以下命名空间
using UTM.CSIS.Xedge;
在主游戏类中为新对象添加一个成员变量
TextOutput textOutput;
在其构造函数中将组件添加到您的游戏中
// Do this in the game's constructor
this.Components.Add(textOutput = new TextOutput(this));
现在,我们可以使用 WriteAt
方法轻松地将文本输出到屏幕上的任何位置,或者我们可以使用 writeAtMouse
方法输出跟随鼠标的文本
textOutput.WriteAt(50, 50, "Hello World!");
textOutput.writeAtMouse("Mouse is\r\n here");
文本将存储在一个列表中,并且当组件绘制自身时,它将自动绘制您提交的所有文本。
关注点
您也可以以不同的颜色或不同的旋转角度输出文本。
textOutput.WriteAt(100, 100, "This will be red.", Color.Red);
代码工作原理
这是一个继承自 DrawableGameComponent
的组件。因此,一旦您将此组件添加到您的主游戏中,它将自动加载并绘制自身。
这是一个类图,显示了该类的设置方式。 顺便说一句,您是否知道只需右键单击该类,就可以直接从 Visual Studio 生成这些漂亮的图表?
最重要的一个方法是 WriteAt
方法。 它只是将文本和属性添加到列表中,如下所示。 它被重载,因此您可以在有或没有颜色参数的情况下调用它。
public void WriteAt(int x, int y, string s, Color c)
{
//create a new textNode
textNode n = new textNode();
//populate x pos
n.X = x;
//populate y pos
n.Y = y;
//populate string
n.Text = s;
//set color
n.FontColor = c;
//set rotation
n.Rotation = m_FontRotation;
//add to the batch list
m_List.Add(n);
}
WriteAt
方法使用以下 struct
来保存文本和属性
struct textNode
{
public int X, Y;
public string Text;
public Color FontColor;
public float Rotation;
}
现在,当需要绘制时,代码只需循环浏览列表并在一个快速的 sprite batch 中输出所有文本。
public override void Draw(GameTime gameTime)
{
base.Draw(gameTime);
if (m_Enabled)//if we want text rendered
{
m_SpriteBatch.Begin(SpriteBlendMode.AlphaBlend,
SpriteSortMode.FrontToBack, SaveStateMode.SaveState);
//foregBatch.Begin();
// This is quicker, but may cause side-effects
foreach (textNode n in m_List)
{
m_SpriteBatch.DrawString(m_SpriteFont, n.Text,
new Vector2(n.X, n.Y), n.FontColor,
n.Rotation, new Vector2(0, 0), 1.0f, SpriteEffects.None, 0.5f);
}
m_SpriteBatch.End();
m_List.Clear();
}//end if (m_Enabled)
}
请注意,由于我们从 DrawableGameComponent
基类继承了该类,因此将自动为我们调用 Draw
方法。
历史
- 1.0 版本 - 2007 年 7 月 2 日