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






1.31/5 (8投票s)
2006 年 5 月 22 日
4分钟阅读

88229

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 ( );
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