65.9K
CodeProject 正在变化。 阅读更多。
Home

XNA 批处理文本输出

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (6投票s)

2007 年 7 月 2 日

3分钟阅读

viewsIcon

47227

downloadIcon

284

一个批量文本输出组件,用于调试 XNA 项目。

引言

注意:这将是 XNA 入门系列文章的第一篇。

当启动一个 XNA 项目时,您会很快发现困难的事情很容易,而容易的事情却很难。您要做的第一件事就是输出一些文本。这里介绍的 TextOutput 组件是一个 XNA 可绘制组件,可以高效地批量输出文本。它主要用于调试辅助工具。

Screenshot - TextOutputDemo.png

背景

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 生成这些漂亮的图表?

Screenshot - TextOutputClassDiagram.png

最重要的一个方法是 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 日
© . All rights reserved.