DX9显示文字
创建Form1,输入以下源码:
Private Sub Form_Load()
'新手注意:游戏编程中,
'通常将窗体的 BorderStyle 设置为“Fixed single”即不允许改变窗体大小
'通常将窗体的 MinButton 设置为“True”即允许最小化
'通常将窗体的 MaxButton 设置为“False”即禁止最大化
'初始化引擎并设置引擎初始化窗体和引擎分辨率,但最好是电脑常用的分辨率比如 640,480 、 800,600 、 1024,768 、 1366,768
CWVBDX9Initialization Me, 800, 600, CW_Windowed
'初始化引擎(目标窗体,横向分辨率,纵向分辨率,窗口模式/全屏模式)
Dim FontDemo1 As CWFont, FontDemo2 As CWFont, FontDemo3 As CWFont '定义CoolWind引擎字体变量
Const HelloWorld$ = "Hello World!"
CWLoadFont FontDemo1, "SimSun", 32, CWF_Bold, False
CWLoadFont FontDemo2, "@SimHei", 32, CWF_Normal, False
CWLoadFont FontDemo3, "Microsoft YaHei", 64, CWF_Normal, False
'载入字体(字体变量,字体类型,字体大小,是否为粗体,是否为斜体)
'注意:载入的字体类型必须是正在运行该游戏的系统上存在的字体.否则将默认按"宋体"载入
'小技巧:在大多数字体名前加上@可以让字体横过来~!
Do While CWGameRun = True '进入游戏循环
If CWD3DDevice9.TestCooperativeLevel = 0 And Me.WindowState <> 1 Then '检测是否可以渲染(设备正常并且窗体未最小化时渲染)
CWBeginScene '准备好绘制场景
CWPaintPicBegin
CWPrintFont FontDemo1, CWFPS, 0, 0, 800, 60, CWWhite, CWF_LeftAl '显示当前FPS
CWPrintFont FontDemo1, "队长~ 是我~!", 0, 100, 800, 60, CWCyan, CWF_LeftAl
CWPrintFont FontDemo2, " 别开枪 ", 0, 100, 800, 60, CWRed, CWF_LeftAl
'输出字体(字体,目标文字,显示起点横坐标,显示起点纵坐标,显示区宽度,显示区高度,字体颜色,对齐方式)
'注意:文字总长度超过显示区宽度将引起换行. 文字总长度超过显示区高度将引起裁剪,即超过部分不显示.
Dim CX&, CY& '计算文本显示大小,并绘制文本边框。
CWCalcrFont FontDemo3, HelloWorld, CX, CY, True
CWPrintFont FontDemo3, HelloWorld, 400 - CX * 0.5!, 300, CX, CY, CWYellow, DT_SINGLELINE Or DT_NOCLIP
CWDrawHRect 400 - CX * 0.5!, 300, CX, CY, CWBlue
CWPaintPicEnd
CWPresentScene '呈现绘制的场景
'*******************************以下为固定写法,不要轻易改动***********************************
Else '当不满足渲染条件时
CWResetDevice '修复设备
End If
Loop
CWVBDX9Destory '销毁CoolWind引擎
End '退出
'*******************************以上为固定写法,不要轻易改动***********************************
End Sub
BAS还是有之前的。
显示效果如下:
ID3DXFont接口:ID3DXFont接口封装了在特定设备上渲染特定字体所需的纹理和资源。
ID3DXFont接口具有以下方法:
通过调用D3DXCreateFont或D3DXCreateFontIndirect获得ID3DXFont接口。
LPD3DXFONT类型定义为指向ID3DXFont接口的指针。
C++调用:
typedef interface ID3DXFont ID3DXFont;
typedef interface ID3DXFont *LPD3DXFONT;
在VB6中调用如下:
Public CWFontList() As D3DXFont, CWFontNum As Long
D3DXCreateFontW CWD3DDevice9, FSize, 0, FBold, 0, FItalic, 1, 0, 4, 0, FName, CWFontList(CWFontNum) '创建字体
其中, D3DXCreateFontW:为设备和字体创建字体对象。
C++调用原型:
HRESULT D3DXCreateFont(
_In_ LPDIRECT3DDEVICE9 pDevice,//指向IDirect3DDevice9接口的指针,与字体对象关联的设备。
_In_ INT Height,//逻辑单元中字符的高度。
_In_ UINT Width,//逻辑单元中字符的宽度。
_In_ UINT Weight,//字体粗细。
_In_ UINT MipLevels,//mipmap级别的数目。
_In_ BOOL Italic,//斜体为True,否则为false。
_In_ DWORD CharSet,//字体的字符集。
_In_ DWORD OutputPrecision,//指定Windows应如何尝试将所需的字体大小和特征与实际字体相匹配。例如,使用OUT_TT_ONLY_PRECIS,以确保始终获得TrueType字体。
_In_ DWORD Quality,//指定Windows应如何将所需字体与实际字体匹配。它仅适用于光栅字体,不应影响TrueType字体。
_In_ DWORD PitchAndFamily,//音高和系列索引。
_In_ LPCTSTR pFacename,//包含字体名称的字符串。如果编译器设置需要Unicode,则数据类型LPCTSTR解析为LPCWSTR。否则,字符串数据类型解析为LPCSTR。参见备注。
_Out_ LPD3DXFONT *ppFont//返回指向ID3DXFont接口的指针,该接口表示创建的字体对象。
);
D3DXFont各个方法说明如下:
1,ID3DXFont::OnLostDevice:使用此方法释放对视频内存资源的所有引用并删除所有状态块。每当设备丢失或重置设备之前,应调用此方法。
C++调用:
HRESULT OnLostDevice();
在VB6中调用:
If CWFontNum > 0 Then
For I = 1 To CWFontNum
CWFontList(I).OnLostDevice
Next
End If
2,ID3DXFont::OnResetDevice:使用此方法重新获取资源并保存初始状态。
C++调用:
HRESULT OnResetDevice();
在VB6中调用:
If CWFontNum > 0 Then
For I = 1 To CWFontNum
CWFontList(I).OnResetDevice
Next
End If
3,ID3DXFont::DrawText:绘制格式化文本。此方法支持ANSI和Unicode字符串。
C++调用:
INT DrawText(
[in] LPD3DXSPRITE pSprite,//指向包含字符串的ID3DXPrite对象的指针。可以为NULL,在这种情况下,Direct3D将使用自己的sprite对象呈现字符串。为了提高效率,如果要在一行中多次调用DrawText,则应指定sprite对象。
[in] LPCTSTR pString,//指向要绘制的字符串的指针。如果Count参数为-1,则字符串必须以null结尾。
[in] INT Count,//指定字符串中的字符数。如果Count为-1,则pString参数假定为指向以null结尾的字符串的指针,DrawText将自动计算字符数。
[in] LPRECT pRect,//指向RECT结构的指针,该结构包含要格式化文本的逻辑坐标中的矩形。矩形右侧的坐标值必须大于其左侧的坐标值。同样,底部的坐标值必须大于顶部的坐标值。
[in] DWORD Format,//指定设置文本格式的方法。它可以是以下值的任意组合:
[in] D3DCOLOR Color//文本的颜色。有关更多信息,请参阅D3DCOLOR。
);
其中 文字格式Format组合如下: