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

在 Direct3D / C# 中创建 HUD:第一部分 - 文本

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.31/5 (8投票s)

2006 年 5 月 22 日

4分钟阅读

viewsIcon

88229

downloadIcon

1213

本教程将教你如何在 Direct3D / C# 中创建 HUD。第一部分将介绍创建和渲染文本的基础知识。

引言

在本系列教程中,我们将使用 DirectX 创建一个 HUD(平视显示器)。这包括从文本到统计信息(FPS、时间等),再到更高级的控件,如按钮和文本框。

背景

本教程中的代码要么取自我的 Tac-Man 游戏项目,要么是为本网站特别创建的。

使用代码

你可以根据自己的意愿使用我提供的所有代码,但不能用于创建另一个教程。你可以将其作为你自己的应用程序的坚实(ish ;))框架,或者打印大量副本,以便在我变得富有且出名时,你可以以每份 100 美元的价格出售它们 ;)

必备组件

要学习本系列教程,您将需要

  • C# 编译器(最好是 Visual C# 2005 Express)
  • 托管 DirectX 9.0 十月 SDK

好的,你需要完成基础教程系列,或者至少拥有一个能够设置 Direct3D 的框架。强烈建议你至少阅读“2D 游戏编程入门”系列的前几篇教程,以了解我假设你在本教程中理解的一些概念。

显示信息

.NET 提供了大量的 GUI 对象,如按钮、复选框甚至日历等。然而,在 DirectX 应用程序中,这些不仅很难看,而且由于 DirectX 无法共享...,所以如果不是不可能,也是不切实际的。因此,大多数游戏开发者会创建自己的 HUD,专门为该应用程序设计和编码。在本教程中,我们将仅仅学习如何创建一个类来将字符串显示到我们的屏幕上。

首先,我们显然需要一个新类来放入引擎中。

在 DirectX 中,我们使用精灵来渲染文本,并使用字体对象来定义字符串的显示方式。我们还有其他变量定义文本的样式(粗体、斜体等)、大小(在矩形内定义)和颜色。

因此,我们的类必须包含显示一个“消息”所使用的所有数据,以及初始化和渲染它的方法。这样,它将类似于我们的 Sprite 类(假设你已经完成了 2D 教程)。

public class hMessage
{
//The text to be displayed by the message
public string Text;
// The 2D location (on screen) of the message
public System.Drawing.Point Location;
//The actual font object to use
public Font Style;
public System.Drawing.Color Color; // The color of the text
public hMessage ( Device dev, System.Drawing.Size size, 
                  FontWeight weight, string fontname, 
                  string text, System.Drawing.Point loc,
                  System.Drawing.Color col )
{
Style = new Font ( dev, size.Height, size.Width, weight, 0, false, 
        CharacterSet.Default, Precision.Default, FontQuality.Default, 
        PitchAndFamily.FamilyDoNotCare, fontname );
Text = text;
Location = new System.Drawing.Point ( loc.X, loc.Y );
Color = col;
}
public void Render ( Sprite spr )
{
  Style.DrawText ( spr, Text, Location, Color );
}
}


所以,这个类并不算太复杂。我们有要显示的文本、它在屏幕上的位置、要使用的字体样式和颜色。正如你所见,渲染函数是 `Font.DrawText()` 方法的包装器,它简单地使用精灵对象和其他影响字体的变量来显示它,这与 `Sprite.Draw2D` 方法非常相似,只是精灵是作为参数传递的,而不是调用对象。

实现这个类后,构建你的引擎并创建一个名为 HUD_1 的新 Windows 应用程序。执行常规操作,删除设计器文件,让窗口类继承自 Engine.gameWindow 而不是标准的 *System.Windows.Forms.Form*,并将简单的 `Application.Run()` 更改为: 

using (Form1 gameForm = new Form1())
{
  Application.Run(gameForm);
} 
现在,回到你的窗体类,用一个简单的调用我们的 `Initialise()` 方法来替换其构造函数的主体,使用标准设置(`windowed = true`)。在我们的类中添加一个 hMessage 对象,这将自然地用于显示我们的文本。
附加一个 Paint 事件处理程序,并向其中添加通用的 D3D 内容,这是
device.BeginScene ( );
device.Clear ( Microsoft.DirectX.Direct3D.ClearFlags.Target, 
               Color.Black, 1.0f, 0 );

device.EndScene ( );
device.Present ( );
this.Invalidate ( );
进行此操作的目的已经在之前的教程中解释过,因此我在这里不再赘述(有关更多信息,请参阅“2D 游戏编程入门”,教程 1-2)。现在,在 `Clear()` 调用之后,我们需要添加一个函数来绘制我们的文本。在我们的类定义中放入一个精灵对象(我将我的命名为 aSprite,简单而独特),并在 `Clear():` 之后添加以下行:

aMessage.Render ( aSprite );

现在,我们需要做的就是初始化这些成员。在 Main 类的 using 块中,在调用 `Application.Run()` 之前,初始化我们的精灵,这里唯一的成员是链接到窗体的继承的 *Microsoft.DirectX.Direct3D.Device* 对象,然后初始化我们的字体成员。既然我们创建了这个类,你应该理解这个过程,但为了了解大小/位置等信息,我将提供样本中使用的调用。
gameForm.aMessage = new hMessage ( gameForm.device, 
         new System.Drawing.Size ( 48, 40 ), 
         FontWeight.Normal, "Ariel", "HELLO \nWORLD", 
         new System.Drawing.Point ( 50, 400 ), 
         System.Drawing.Color.Yellow ); 

你应该现在能够运行应用程序了。我建议你以此为基础,开始尝试不同的位置/大小,以便对调用有一个大致的了解。

在第二部分教程中见,我们将学习如何使用/修改我们的类来显示应用程序的“生命统计数据”,例如经过的时间、生命数,甚至显卡信息。


 有关 HUD、2D 和 3D 游戏编程以及地形渲染的更多 Managed DirectX 教程,请访问我的网站 http://www.just-code-it.net
© . All rights reserved.