第五章 核心製作
5.9 其餘類別概述
圖 5.20 按鈕的 4 種狀態圖片 圖 5.21 選單實作 1 圖 5.22 選單實作 2
5.9 其餘類別概述
先列出我們最後程式碼完成時,所有類別的概觀(Class View),這 是由 Vc++產生的,看起來實在是滿壯觀的。如圖 5.23。
在此描述一些有用到特殊觀念的類別:
z 攝影機類別(cCamera)
利用一個類別紀錄一台攝影機的擺放位置,焦點位置,以矩陣型態 紀錄,並利用 IDirect3DDevice8 物件的 SetTransform 函式,重新配 置新的攝影機矩陣,這台攝影機裡頭當然也包含一些屬性,利用各種 函式呼叫改變其屬性,如圖 5.24 為其類別定義中的一部分。
z 告示牌類別(cBillboard)
這個類別的功能在於將一張 2D 圖片放於 3D 場景之中,且隨著鏡頭 (玩家的視點)的位置改變,此張圖片永遠正向朝著螢幕,讓這張圖片
圖 5.23 完整程式類別概觀(Class View)
圖 5.24 cCamera 類別定義
圖 5.25 告示牌示意圖
看起來像是 3D 模型的樣子,可以從各個角度觀看,如圖 5.25,而使用 的技巧是隨時改變圖片頂點的世界座標矩陣,讓多邊形與檢視對齊,
而檢視矩陣的角度使用者已經知道,所以只需要用相反的檢視角度建 構矩陣即可,可用矩陣的轉置作業,達到這樣的效果,公式如下。
圖 5.26 告示牌效果 圖 5.27 小地圖
m_pD3DDevice->GetTransform(D3DTS_VIEW, &matView);//取得檢視 矩陣
D3DXMatrixTranspose(&matTransposed, &matView);//轉置作業 matTransposed._41 = m_XRotaxis;//平移多邊形中心的 x 座標 matTransposed._42 = 0.0f;
matTransposed._43 = m_ZRotaxis; //平移多邊形中心的 z 座標 matTransposed._14 = 0.0f;
matTransposed._24 = 0.0f;
matTransposed._34 = 0.0f;
將檢視矩陣做轉置的作業,並套用網格的平移位置,讓每件事物都適 當的面對檢視,產生的效果如圖 5.26 所示。
z 地圖類別(cMap)
是利用 IDirect3DDevice8 物件的 SetViewport 函式來產生與主視 埠(view port)相同 3D 場景的畫面,在至場景上空架設攝影機,從高 處俯視下來,效果如圖 5.27 所示。程式碼如下,相當簡易。
//先取得舊的視埠
if(FAILED(m_pD3DDevice->GetViewport(&m_OldViewport))) return FALSE;
//設定視埠
m_pD3DDevice->SetViewport(&d3dvp);
z 血量球類別(cBlood)
沒什特別的地方,只是那個紅色血量的動態顯示,讓我們花了兩天
的時間才想出來。方法是利用大約 3 百個頂點,其中一個頂點當作底
圖 5.28 扇型示意圖 (DirectX 官方網站截圖)
圖 5.29 繪製血量的演算法
部的中心點,其餘頂點以扇形方式與之聯結,依照順序一左一右從球 形的下面往上面聯結,如圖 5.28,當扇型越來越多時,就像是一個圓。
程式碼如圖 5.29,顯示畫面如圖 5.30。
圖 5.30 血量表顯示畫面 圖 5.31 四元樹與八元樹概念圖 (取自「2D/3D RPG 角色扮演遊戲」一書) z 3D 節點類別(cNodeTreeMesh)
分為四元樹(Quadtree)與八元樹(Octree),此類別主要是秀出一個 大型的.x 檔場景,類似一個 3D 引擎,將一個場景分成許多節點
(sNode);一個大型場景的網格有很多頂點(sVertex),一個節點可能 會包含多個多邊形(sPolygon),而每個多邊形中會有三個頂點,而每 個多邊型都會被分配到某一個紋理群組(sGroup),每一個紋理群組裡 頭的多邊形,都使用相同的紋理。當.x 檔要渲染(Render)的時候,就 依照紋理群組的順序,依序將多邊行繪製出來,可省下不少載入紋理 的時間。而四元樹與八元樹的差別,只在於其子節點的個數是四個或 八個,如圖 5.31,每一個方型或是方體都是一個節點。詳細 3D 節點類 別的介紹,可參考「2D/3D RPG 角色扮演遊戲」562 頁~586 頁。
其實大部分的類別都是有參考別人所寫的東西,加以演化變成自己 的,這是初學者最佳的學習捷徑。很多類別我們不太想再贅述,有興 趣的人可以上墨魂網站http://www.inksoul.idv.tw 下載完整程式 碼,裡面有詳盡的程式碼註解。