yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2010-2-6, PM 6:21 星期六 文章主題: 3D遊戲程式設計入門第9章心得 |
|
|
前言:此乃補丁文。只講解心得,不提供完整教學,有興趣的人請自行購買此書。
代碼: | 書名:3D遊戲程式設計入門-使用DirectX 9.0實作
作者:Frank D. Luna
譯者:黃聖峰
出版社:博碩文化 |
書上教的用DX顯示文字方式有三種:
一、使用D3DXFONT_DESC結構與D3DXCreateFontIndirect函式來取得ID3DXFont介面以繪製文字(底層是GDI)
二、引用d3dfont.h、d3dfont.cpp、d3dutil.h、d3dutil.cpp、dxutil.h及dxutil.cpp來建立CD3DFont類別實體,以之繪製文字(底層是D3D)
三、使用LOGFONT結構與CreateFontIndirect函式來取得HFONT控制碼,再用D3DXCreateText函式與設定了HFONT的HDC來取得ID3DXMesh,以之繪製3D文字
其中第一種因為底層是GDI,所以繪製速度較慢,但支援複雜的字型與格式
而第二種因為底層是D3D,所以繪製速度較快,可是只支援簡單的字型格式
另外,第一種在書上寫的是以LOGFONT結構與D3DXCreateFontIndirect函式來取得ID3DXFont介面
但那是早期的D3D9的作法,後期的D3DXCreateFontIndirect函式的參數改成了使用D3DXFONT_DESC結構
所以範例code中有些地方要改變,首先:
代碼: | LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight = 25; // in logical units
lf.lfWidth = 12; // in logical units
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
lf.lfItalic = false;
lf.lfUnderline = false;
lf.lfStrikeOut = false;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfOutPrecision = 0;
lf.lfClipPrecision = 0;
lf.lfQuality = 0;
lf.lfPitchAndFamily = 0;
strcpy(lf.lfFaceName, "Times New Roman"); // font style
if(FAILED(D3DXCreateFontIndirect(Device, &lf, &Font))) |
這一段code請以下面這段取代:
代碼: | D3DXFONT_DESC desc;
ZeroMemory(&desc, sizeof(D3DXFONT_DESC));
desc.Height = 25;
desc.Width = 12;
desc.Weight = 500;
desc.Italic = false;
desc.CharSet = DEFAULT_CHARSET;
desc.OutputPrecision = 0;
desc.Quality = 0;
desc.PitchAndFamily = 0;
strcpy(desc.FaceName, "Times New Roman");
desc.MipLevels = 0;
if(FAILED(D3DXCreateFontIndirect(Device, &desc, &Font))) |
另外繪製文字的函式參數也有改變,多了一個參數,所以要把下面這段:
代碼: | Font->DrawText(
FPSString,
-1, // size of string or -1 indicates null terminating string
&rect, // rectangle text is to be formatted to in windows coords
DT_TOP | DT_LEFT, // draw in the top left corner of the viewport
0xff000000); // black text |
改成這樣:
代碼: | Font->DrawText(
NULL,
FPSString,
-1, // size of string or -1 indicates null terminating string
&rect, // rectangle text is to be formatted to in windows coords
DT_TOP | DT_LEFT, // draw in the top left corner of the viewport
0xff000000); // black text |
在第一參數加個NULL
這個第一參數是要設定為包含此Font的LPD3DXSPRITE
如果設成NULL,它會把文字繪製在自己所屬的LPD3DXSPRITE上
嗯…我是猜測所謂的"自己所屬的LPD3DXSPRITE"就是以其繪製的座標自動偵測所屬的LPD3DXSPRITE
也因此,MSDN上說當文字在一列中被繪製超過一次時,明確的指定其所屬的LPD3DXSPRITE有利於加速繪製
我想就是因為省略了自動偵測的步驟(大概吧) |
|