C++ Builder是一個可視化的C++編程環境,它為編程人員提供了一種方便高效、簡便的C++語言開發工具,因此已為廣大C++程序員所青睐,DirectX開發工具包是微軟公司提供的一套Windows9X下開發高性能圖形、聲音、輸入輸出和網絡游戲的接口,其高效的直接硬件訪問、程序與硬件設備之間的相對獨立等特性,幾乎使得DirectX成為唯一可以在Windows操作系統下開發游戲程序的基本工具軟件。
雖然C++ Builder中直接包含了一套DirectX3的開發包,也提供了一些例程,但是這些例程沒有系統化的說明,同時也不適合DirectX5以上的程序開發。另一方面,幾乎所有關於DirectX開發的書籍和文獻均使用Visual C++語言描述,所以作者將自己在C++ Builder中的一些開發經驗介紹給讀者。
本文適合具備C++ Builder面向對象編程經驗的讀者,實例開發環境為中文Windows98、C++ Builder4、DirectX6或以上的開發工具包。
一.DirectX簡介
1_1.DirectX的特性
1_2.DirectX是一種Windows環境下標准的高性能游戲、多媒體開發工具包,使用DirectX開發的程序能夠與操作系統默契地配合成為“真正”的桌面應用程序;可以利用硬件廠商提供的驅動程序接口,充分最佳的設備性能;通過直接底層硬件操作,實現最快速、短延時、設備無關的底層接口。
1_3.DirectX采用了組件對象模型(COM)標准,因此對於不同對象的版本可以有不同的接口,這使得用DirectX開發的程序在未來將得到完全兼容和支持的保證。
1_4.DirectX的結構
DirectX需要以設備無關的方法提供設備相關的性能,所以DirectX的結構是由兩個驅動程序構成:硬件抽象層(HAL)和硬件模擬層(HEL),當Direct對象創建時,會同時建立一張“兼容表”,其中記錄了當前硬件系統支持的功能,當DirectX需要實現某個功能時就查詢該表,得到硬件對功能的支持信息,如果功能能夠得到硬件支持,則向HAL發出求,以得到硬件的支持,否則向HEL發出請求,以模擬方式實現功能。
1_5.DirectX的主要組成
(1)DirectDraw:直接訪問圖形硬件,管理用於顯示的內存(顯示內存和系統內存),提供高速圖形和頁面切換動畫;
(2)Direct3D:提供3D硬件接口;
(3)DirectInput:主要支持輸入服務,同時支持輸出設備;
(4)DirectSound:提供3D聲音效果,管理聲卡內存;
(5)DirectPlay:提供網絡多人游戲的通訊、組織功能;
(6)DirectSetup:自動安裝DirectX驅動程序。
本文將按照DirectX的上述組成,分別以實例介紹其在C++ Builder中的實現方法。
二.DirectDraw程序設計
2.1 DirectDraw實現的基礎—顯示方式的設置
設計圖形程序首先遇到的問題是將屏幕設置成一種合適的圖形顯示方式,然後把圖形繪畫到屏幕頁面上。如果您在DOS下開發圖形應用程序,這將是很簡單的事,只要調用DOS的中斷服務程序即可實現,但是使用用DirectDraw就比較復雜。由於DirectDraw的設計目標是提供設備無關的編程接口和高效、多功能的硬件訪問支持,所以DirectDraw需要考慮更多的問題。
DirectDraw在Windows環境下支持兩種圖形方式:全屏幕獨占方式和窗口方式。這裡我先以全屏幕獨占方式,介紹DirectDraw設置屏幕顯示方式步驟,函數具體使用格式和編程方法將在2.2中介紹:
2.1.1 選擇硬件設備
計算機系統不一定只有一個DirectDraw硬件抽象設備,例如,一台計算機可能有兩台或更多的顯示器,那麼DirectDraw對象與哪個HAL對應呢?我們可以使用DirectDrawEnumerate函數來枚舉系統所有已安裝的設備,以供選擇,並返回設備的唯一標識GUID。DirectDraw默認主顯示設備的GUID為NULL;
2.1.2 創建DirectDraw對象
由於DirectX是使用面向對象的程序設計技術,因此,使用DirectDraw編程就首先要創建DirectDraw對象。使用DirectDrawCreate函數及將第一步獲得的設備GUID作為參數可以創建基於所選設備的DirectDraw對象;
2.1.3 獲取DirectDraw更高版本的COM接口
如果您不打算使用DirectX5以上版本提供的功能則可以跳過本步驟,否則必須使用新創建DirectDraw對象的QueryIntrface方法來獲得IDirectDraw2或更高的COM接口。在2.2例中將介紹如何獲得DirectX5以上版本提供的IDirectDraw2接口;
2.1.4 設置協作級別
協作方式可以控制程序與系統其他應用程序之間的交互關系,典型的例子是:設置為全屏獨占方式還是窗口普通方式。設置協作級別可以用DirectDraw對象的SetCooperativeLevel方法;
2.1.5 枚舉設備支持的各種顯示方式,選擇並設置合適的顯示分辯率、色彩深度和刷新頻率等。
使用DirectDraw的EnumDisplayModes方法可以枚舉設備支持的所有圖形方式供用戶選擇,在某些已確定圖形顯示方式的應用程序中可以通過此枚舉功能來檢查系統設備是否支持指定的圖形顯示方式。
使用DirectDraw的SetDisplayMode方法可以設置所需要的圖形顯示方式。