Chapter 2 遊戲發展平台與工具
2.2 DirectX
2.2.4 DirectX 的分類
DirectX 是為了電腦遊戲與多媒體等消費性娛樂市場為目標發展的,所以幾 乎電腦遊戲所牽涉到的層面,DirectX 都有包含到,如電腦 3D 繪圖( 2D 是由 3D 來模擬)、聲音、網路、動畫、多媒體,以及滑鼠、鍵盤、搖桿等遊戲輸入裝置,
都在DirectX 的範圍之內。隨著版本的更新所以內部成員可能都有所不同。由於 我們是使用DirectX 8.1 所以以下介紹都是針對 DirectX 8.1 解說的。DirectX 是依 據功能來區分內部成員,如表2-3 所示。 DirectAnimation 整合動畫
在我們專題使用的CORE 中,有碰觸到的只有 DirectGraphics、DirectAudio、
DirectInput、DirectPlay 等四部份,因此我們只針對這四項來做介紹。
2.2.4.1 DirectGraphics
簡單來說這部份負責將影像呈現在螢幕上,其中的轉換都是在這裡面完成。
DirectX 7 版之前,電腦繪圖的部分分為 DirectDraw 的 2D 繪圖與 Direct3D 的 3D 繪圖,在 DirectX 8 之後,則把繪圖部分的 DirectDraw 與 Direct3D 合併為 DirectGraphics,事實上是已經取消 DirectDraw 的介面,若需 2D 的繪圖,也是以 3D 來模擬 2D。
2.2.4.1.1 內部元件
DirectX 8.1 版中 DirectGraphics 的元件如表 2-4 所示。
表 2-4 DirectGraphics 的元件
IDirect3D8 IDirect3DSurface8 IDirect3DDevice8 IDirect3DVolume8 IDirect3DIndexBuffer8 IDirect3DVolumeTexture8
IDirect3DVertexBuffer8 IDirect3DResource8
IDirect3DbaseTexture8 IDirect3DSwapChain8 IDirect3DTexture8
其中最重要且常用到的就是 IDirect3D8 和 IDirect3DDevice8 在我們使用 Graphics 核心中也是主要利用這兩個。下面分別介紹它們之功能:
(1) IDirect3D8:取得圖形硬體方面的資訊,並建立環境的介面。
(2) IDirect3DDevice8:取得或設定裝置的狀態、描繪原型、開啟和關閉場景、光 源與材料的設定、資料流、表面紋理的設定、建立緩衝區,以及定義投影矩陣、
世界轉換矩陣、視點轉換矩陣等等,是DirectGraphics 中最多函式的元件。
2.2.4.1.2 建立模型 如直接輸入頂點資訊的立即模式(Immediate Mode,IM)。
2.2.4.2 DirectAudio
簡單來說,這裡負責處理的就是平時在遊戲中所聽到的背景音樂或是音效。
DirectAudio 是由 DirectSound 和 DirectMusic 這兩個元件所構成。DirectSound 是 播放數位式聲音的主要元件。DirectMusic 則是負責處理所有的歌曲格式包含 midi、DirectMusic 的原始格式(*.SGT)和 WAVE 檔,並將它們傳給 DirectSound 來播放。
2.2.4.2.1 注意事項
在使用DirectAudio 來播放音樂或音效時應該注意三點,不然可能會沒有聲 音,或者聽起來怪怪的。
(1) 設定合作的等級:是設定 IDirectSound8 物件的合作等級,這決定與其它應 用程式共用音效卡資源的方式。假如沒有設定會導致完全沒聲音。
(2) 設定正確的聲音頻率:假如要播放的音樂是以 44100Hz 錄製,但是卻設 定了較低的頻率播放,那可能會讓聲音聽起來失真。
(3) 設定正確的取樣位元數:通常是以 8 或 16 bit 為主,假如設定超過音效卡 支援的bit 數,那也會播不出聲音來。
2.2.4.3 DirectInput
DirectInput 是用來處理所有輸入裝置的相關問題,如滑鼠、鍵盤以及搖桿 等,在Visual C++中也有滑鼠與鍵盤的函式,而 DirectInput 較特殊的就是對於搖 桿的支援,尤其是在搖桿具有力回饋的功能時,更能加強在電腦遊戲時的娛樂效 果。
2.2.4.3.1 內部元件
表 2-5 DirectInput 的元件
IDirectInputDevice8 取得或釋放輸入裝置控制權,讀取輸入 裝置的資訊,建立力回饋特效等等。
IDirectInputEffect 取得特效種類,開啟或停止特效等。主 要用於搖桿和某些特定滑鼠上
2.2.4.3.2 設定輸入裝置
(1) 取 的 設 備 之 GUID : 每 個 設 備 都 有 自 己 的 GUID(Global Unique Identification)。譬如以鍵盤來說系統就會把它定義成 GUID_SysKeyboard。
(2) 建立 Device COM 物件:因為 DirectX 是由 COM 介面來存取。
(3) 設定資料的格式:每個設備都有自己定義的格式,譬如滑鼠滾軸、按鍵等等,
在DirectX 裡面有定義一些基本的設定可以直接套用。
(4) 設定合作等級:設定輸入裝置可否被其它應用程式所共用。
(5) 取得設備後,就可以開始讀取定義的裝置所輸入的資料了。
2.2.4.4 DirectPlay
DirectPlay 是用來處理網路連線方面的問題的解決方案。不論是使用 TCP 或 者 UDP 來建立連線,還是傳輸遊戲資料、即時語音傳送都是使用 DirectPlay 的 元件來完成。在 DirectX 8.0 的時候,微軟已經簡化了一些瑣碎的過程,只留下 四 個 主 要 的 COM 元 件 分 別 是 IDirectPlay8Client 、 IDirectPlay8Server 、 IDirectPlay8Peer、IDirectPlay8Address。它們各自的主要功能如表 2-6 所示。
表 2-6 DirectPlay 內部元件
名稱 功能
IDirectPlay8Client 這是 Client 端的網路元件,用於建立 Client 端以及連結 Server 端。
IDirectPlay8Server 這是 Server 端的網路元件,用於建立 Server 端以及連結 Client 端。
IDirectPlay8Peer 這是對等網路(Peer To Peer)元件,可連 結其它的用戶端
IDirectPlay8Address 這裡面包含了建立網路位址的元件,用 於連上遠端的網路系統。
2.2.4.4.1 建立連線的方法(以 Client – Server 架構為例)
(1) 產生應用程式專屬的 GUID:只有具有相同 GUID 的程式才能互相連結,確 保不會連結到不相干的程式。因此Client 端和 Server 端要使用相同 GUID。
(2) 初始化網路元件以及位址元件:接下來就是建立網路元件和位址元件,譬如 要建立Client 端就要採用 IDirectPlay8Client 元件裡面定義的函式來建立。在 DirectX 8.1 版裡面,不論是 Client、Server 或者網路位址的建立,都已經統一 使用CoCreateInstance 這個函式,與之前各自分開函式有所不同。
(3) 取得連線設備的 GUID、遠端位址還有 Local 端使用的 Port (4) 建立連線。
(5) 接下來連線程式之間的訊息傳遞,只要兩邊訊息格式定義一樣即可。