電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
3D遊戲程式設計入門第9章心得

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
yag
Site Admin


註冊時間: 2007-05-02
文章: 684

2639.56 果凍幣

發表發表於: 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有利於加速繪製
我想就是因為省略了自動偵測的步驟(大概吧)
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作