遊戲開發新手入門之DirectX入門(轉)

post0發表於2007-08-12
遊戲開發新手入門之DirectX入門(轉)[@more@]

  ☆ 簡介

  今天我們要接觸到令人敬畏的DirectX。它比Windows GDI要快好幾倍,可用於不同的語言和多種平臺,支援從繪製象素到高階3D圖象,從播放簡單聲音到數字音樂,從鍵盤控制到反震手柄……它給你遊戲程式設計所需的一切(有點誇張)。當然了,它是巨大的,需要好幾本書才能含蓋它的全部。先不要去擔心我在這裡所教給你之外的數不清的知識,畢竟我把你推到了起跑線上。

  

  閱讀本章,你需要前幾章的知識和C語言的知識,由於我們還要談到元件物件模型(COM),它是物件導向系統的基礎,你最好還要有一點兒C++的知識。沒有也不太要緊,我在講到這處時會照顧你的。反正你記住,使用DirectX並不需要多少C++的知識。開始吧!

  

  ☆ 什麼是DirectX?

  DirectX是遊戲製作者的API(Application Development Interface)。它是一組允許你直接控制計算機硬體裝置的軟體。如果你的硬體支援DirectX,並且你用硬體加速你的程式,這就意味著一個字――快。不用擔心你的硬體知識,你不會真正的接觸到它們。我們是透過硬體抽象層(HAL)和硬體模擬層(HEL)來保證裝置無關性和讓你的程式正常執行。

  

  DirectX由很多元件構成,每一個都有特定的用途。元件DirectDraw是最為重要的一個,因為所有的圖形都要用到它,它是2D圖形的引擎,3D圖形也同樣離不開它。DirectDraw是我們今天就要說的。其它的元件是:

  

  ▲ DirectSound:提供硬體和軟體的聲音混合與回放。

  

  ▲ DirectMusic:處理基於訊息的音樂資料。它支援樂器數字介面(MIDI)併為建立互動式音樂提供創作工具。

  

  ▲ DirectPlay:使得透過調變解調器連結或透過網路來與應用程式相連成為可能。

  

  ▲ Direct3D:是一個三維圖形包,它提供一個高階的保留模式(Retained Mode)介面,這使得你能夠實現一個完整的三維圖形系統。它還包含一個低階的即時模式(Immediate Mode)介面,使得應用程式獲得對渲染管線的完全控制。

  

  ▲ DirectInput:為包括遊戲杆、滑鼠、鍵盤和遊戲控制器在內的輸入裝置提供支援。它還為反饋遊戲裝置提供支援。

  

  ▲ DirectSetup:為DirectX提供了一個簡單的安裝過程。它簡化了更新顯示和音訊驅動程式的過程,並且確保沒有硬體或軟體衝突的存在。

  

  ▲ AutoPlay:讓你能夠製作一張一旦插入驅動器就能自動安裝的光碟。AutoPlay並非DirectX所獨有,因為它是Microsoft Win32 API的一部分。

  

  元件物件模型(COM)是DirectX的基礎,有一些技巧建立COM物件――別問我怎麼做――但你知道一點點還是有好處的。我只是簡單說一下,如果你有興趣,具體的細節就自己查資料吧!可能下一節你有些困惑,但不要緊,我所說的你不用太明白,畢竟我們的目的是使用COM物件,這可比建立容易多了。

  

  ☆ 元件物件模型(COM)

  COM介面是DirectX技術的基礎,沒有COM就沒有DirectX。(不用擔心,你只需要對COM技術有一個粗淺的瞭解就可以使用DirectX――只要你在編寫DirectX應用程式時遵循一定的步驟,甚至都可以在不瞭解COM的情況下使用DirectX。

  

  DirectX的大多數API都是基於COM結構的。COM為軟體模組化和軟體重用提供了最堅實的基礎,它的最重要的概念就是介面(interface),介面是軟體重用的最基本方法。更專業的說,介面是一系列操作的規範描述,即介面規範。

  

  所有的COM介面都是從Iunknown介面繼承而來的,IUnknown介面是所有COM介面的根。IUnknown介面具有3個方法:

  

   QueryInterface():此方法查詢新介面,並在新介面存在時返回之。

  

   AddRef():此方法在介面或其它應用程式連編到此COM物件上時將引用計數值遞加1。

  

   Release():此方法將COM物件的引用計數遞減1。當引用計數遞減到0時,該COM物件自動釋放。

  

  所有COM物件都具有這三個方法。雖然DirectX應用程式一般不需要考慮引用計數的問題,但引用計數確實是存在的,它已經由DirectX自動完成了。我們所要做的,就是建立DirectX物件,然後在使用完畢後呼叫Release方法釋放引用。

  

  ☆ 設定

  用DirectX建立程式,你需要有三件主要的事要做。第一件事是COM物件本身,它們包含在.DLL檔案裡,這些.DLL檔案需要在Windows裡註冊,這在安裝DirectX軟體包時已經完成了。這些物件是我們建立DirectX應用程式時用到的介面,例如IdirectDraw。但這還不夠,因為在COM層上直接使用DirectX是令人沮喪的和乏味的。我們希望有更容易的辦法解決它。利用靜態庫(.LIB檔案)是個好辦法,它是DirectX軟體包的一部分,你可以從Microsoft免費獲得。它有一個“打包”函式使你工作更輕鬆。使用DirectX的不同元件,你需要連結不同的靜態庫。例如你要使用DirectDraw元件,你就需要ddraw.lib。

  

  最後,你還需要DrectX標頭檔案,它包含函式原形、宏、常量和你需要用到的各種型別。對於DirectDraw,這個標頭檔案是ddraw.h。

  

  要確認你使用了正確的檔案版本,你還得讓編譯器包含軟體開發包的目錄。具體的做法是:

  

  首先點選Tool選單,選擇Options,然後點選Directories,在Show Directories for 組合框下拉選單中選擇Include files,增加一個新的目錄。將你的DirectX的路徑填入。(例如:C:DXSDKinclude)然後將它移到列表的第一位,使編譯時第一個尋找它(防止尋找老版本)。然後選擇Show Directories for組合框下拉選單中的Library files,方法同前,只是把include改成lib。現在,你已經設定完了DirectX。你仍然需要手動增加一些庫檔案到你的專案中,但先不急,我將在以後講它。我們將使用DirectX 7.0。

  

  ☆ DirectX版本號

  你可能認為版本號沒有什麼好講的,但我們確實要說一說。Microsoft在DirectX裡建立了令人難以置信的科技,但它並不代表不使人迷惑。對於每一個DirectX版本,並不是所有的介面都一次次的升級。因此,儘管DirectX有了7個版本(我寫文章時DirectX8.0正準備釋出),但DirectDraw並沒有7個版本。當DirectX6是最新版本時,DirectDraw的最新介面版本是IDirectDraw4,不是IDirectDraw6。現在最新的版本是DirectX7,所以我們要用IDrectDraw7。很奇怪,是不是?我想你已經明白了我的意思,請不用因為以後看到的感到困惑了。

  

  最後一件事。當我寫這篇文章時,DirectX7是最新的可用版本,但或許現在你已經有了DirectX8,並且或許你還聽說了,DirectDraw將不再升級了,取代它的是DirectX Graphics,這是一個功能強大的圖形API。但DirectDraw不升級就意味著我們不學習它了,畢竟都離不開COM。如果你想用DirectX8的介面寫2D的遊戲,你需要用3D方法去建立2D觀點。聽起來很棒,是的,的確如此,因為使用3D介面將給你更多的硬體支援,例如阿爾發混合。但這也恰恰是個問題,如果機器沒有相應的硬體裝置,程式會以更慢的速度執行。

  

  DirectDraw是很容易學的。由於DirectX中的3D圖形是基於DirectDraw的,3D應用程式在DirectDraw環境中執行;極少有應用程式專門使用3D。大多數程式使用3D函式對一些物件建模,而另一些物件,諸如背景和精靈,是以2D圖形渲染的。所以本系列將使用DirectDraw。關於DirectX8,我還沒有太多的瞭解,因此我只能對DirecX7做詳細介紹。總的來說,你使用DirectX,還是離不開DirectDraw的。

  

  ☆ DirectDraw概述

  在你的程式中使用DirectDraw,你至少要做四件事,它們是:

  

  1、建立一個DirectDraw物件。

  

  2、設定協作等級。

  

  3、設定顯示模式和色彩深度(全屏模式)。

  

  4、至少建立一個DirectDraw表面。

  

  在講怎樣完成以上步驟之前,先讓我們瞭解一下每一步的含義。第一個,要建立一個DirectDraw物件,這意味著我們要建立一個指向IDirectDraw7介面的指標。這很簡單,不是嗎?有三種辦法可以實現它,你可以直接使用COM,或使用DirectDraw的兩個函式之一。三種辦法各有千秋,我們過一會兒將詳細介紹。第二個,設定操作等級。這可能對你來說比較新鮮。協作是由於Windows是一個多工作業系統而產生的概念。意思是所有執行的程式都要隨時告知Windows它們將要或正在使用的資源,這將保證你所要使用的資源不會被windows再分配給別的應用程式。不用擔心,有一個很簡單的函式完成它。

  

  第三個你是否有點熟悉?如果你要寫一個全屏的程式,通常是遊戲程式,你需要設定顯示模式和色彩深度。在Windows的應用程式裡做這些通常不是一個好主意,因為它能導致其它程式的同時執行出現問題。當你結束自己的程式時,你當然要恢復到改變前的狀態。設定全屏模式,只是呼叫一個單獨的DirectDraw的函式,程式結束後,要恢復原來的狀態。

  

  最後,也是最重要的,是DirectDraw表面的概念。操縱表面是DirectDraw的全部。簡單的說,DirectDraw表面是一個用於儲存圖象資料的線性記憶體區域。DirectDraw表面的大小就是以象素為單位,用寬和高來定義。所以你可以認為表面是一個用來畫圖的矩形區域。它有自己的介面,稱作IDirectDrawSurface7。有三種主要的表面,我們將在本章和下一章分別用到它們。

  

   主表面:每一個DirectDraw應用程式都有一個主表面。主表面就相當於使用者的顯示器。它的內容是可見的。同理,主表面就是根據顯示器的顯示模式設定寬和高。

  

   後緩衝區:後緩衝區是緊隨主表面的表面,但它不可見。它是動畫沒有閃爍的主因,通常,你在後緩衝區畫好每一幀,然後把後緩衝區的內容複製到主表面,使它顯示出來。由於它緊隨著主表面,所以它的大小同主表面相同。(你就理解為樓上和樓下的關係)

  

   離屏緩衝區:它很象後緩衝區

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951640/,如需轉載,請註明出處,否則將追究法律責任。

相關文章