DirectX5.0最新遊戲程式設計指南 (轉)

worldblog發表於2007-12-06
DirectX5.0最新遊戲程式設計指南 (轉)[@more@]

5.0最新遊戲指南
綜述篇
武漢 朱春喜 & 吳佳鮮

  對於眾多的遊戲製作者來說,的DirectX 5的推出不啻是一個極好的訊息。它包含了編制下一代遊戲和多應用的最新技術和工具,為廣大的程式設計師提供了一整套的應用程式介面,使程式設計師能夠設計高實時的應用程式。DirectX使執行在Microsoft 操作下的遊戲比執行在 MS-DOS下的遊戲具有更高的效能的更好的互動性,甚至比專用的遊戲機也不遑多讓。
  Microsoft開發DirectX的首要目的就是要提高Windows環境下游戲開發的容易性。在此之前,個人上的大部分遊戲都是基於MS-DOS的,遊戲開發人員必須針對不同的介面卡編制不同的程式,儘管程式碼類似,但不可避免存在許多的重複勞動。利用DirectX, 遊戲開發人員就可以獲得DirectX的硬體獨立性的優點,同時又可以直接訪問硬體。DirectX的最主要的目標就是提供MS-DOS中直接的硬體訪問特性,同時去掉個人電腦中再新增新的硬體時所帶來的硬體識別問題。
  因為硬體的升級是不可避免的,所以,DirectX實際上也提供了另一種即插即用的方法。因此,利用DirectX可以開發出高效能實時的應用程式,可以直接訪問計算機中的硬體和將來系統中回具有的硬體裝置。DirectX在硬體和應用之間提供了一致的介面以減少和的複雜性,並且使硬體的利用達到最優。利用DirectX提供的介面,程式設計師能充分利用硬體的特性而不需要考慮其具體細節。一個優秀的基於Windows的高效能遊戲應該能夠利用系統的如下技術:
.為提高效能而專門設計的加速卡
.即插即用PnP(Plug and Play)
.內嵌於Windows的通訊服務,包括DirectPlay
  DirectX 5包括七個部分,下面對各部分作以簡要說明。
(1).DirectDraw  透過支援訪問屏外顯示中點陣圖的軟硬體加速技術,直接存取,利用硬體的位塊傳輸和緩衝區翻轉功能。
(2).DirectSound 提供軟硬體混合和錄音再生功能。
(3).DirectPlay  使得遊戲在調變解調器和之間的連線更加簡單方便。
(4).Direct3D  提供了高階保留(Retained-Mode)介面和低階即時模式(Immediate-Mode)介面。前者允許程式很容易地完成一個完
全的三維圖形系統,後者使得程式能完全控制著色管道。
.DirectInput  提供了基於Windows遊戲的輸入的API和程式,它不僅支援目前的鍵盤、滑鼠和操縱桿,也支援將來的基於Windows的輸入裝置。
.DirectSetup  提供了DirectX的一次性安裝過程。
(7).AutoPlay  它是Windows 95的特性,當你將光碟放入時,它能自動執行安裝程式或遊戲。事實上,AutoPlay也是Microsoft API的一部分,而不是僅存在於DirectX SDK中。.
  透過查詢各種DirectX介面,你可以檢測系統中安裝的是DirectX的哪個版本,DirectX  SDK中的範例GetDXVersion.cpp中的GetDXVersion可以完成這一任務。該函式建立了一些關鍵的DirectX物件──一個DirectDraw物件、一個DirectDrawSurface物件和一個DirectInput物件── 來檢測安裝在系統中的DirectX的版本。如果系統中安裝了老版本的DirectX SDK,必須確保不要包含它的INCLUDE和LIB路徑,使用DirectX 5標頭檔案編譯後的程式碼同DirectX 3的庫連結後將會出現不可預知的錯誤。
  因為C++語言更能夠對計算機硬體作直接的訪問,所以DirectX採用了C++語言作為開發的主語言。而DirectX又是專門為Visual C++設計的,所以編寫DirectX程式最好能在Visual C++下進行。當然Borland C++5.0也沒問題,只是配置有些不同罷了,下面將會提到這一問題。為了降低程式設計的難度,一些公司也針對DirectX開發了執行在不同程式設計環境中的,如Arakelian Soft公司的控制元件DirectStudio98
for 5.0、Tegosoft公司的TegoSoft ActiveX for Visual Basic、還有John Pullen、Paul Bearne和Jeff Kurtz開發的執行在下的Delphi Games Creator等。考慮到相容性問題,最好還是能使用Visual C++。

一、DirectX和部件物件模型COM
1.1、 部件物件模型COM(Component Model)
  DirectX中的大部分API都由基於COM的物件和介面組成。COM是介面重利用的基於物件的系統的基礎,是COM程式設計的核心模型,它也是一種介面規範。在作業系統級別上,它又是一個物件模型。
  許多DirectX API都建立為COM物件的例項。你可以將一個物件看做一個黑盒子,物件透過介面與物件通訊,透過COM介面傳送給物件或從物件接收的命令稱為方法。例如,IDirectDraw2::GetDisplayMode方法是透過IDirectDraw2介面從DirectDraw物件獲得當前的顯示模式。物件在執行時可以同其他物件捆綁在一起,並且能夠使用這些物件的介面。如果你已知道某個物件是COM物件,並且知道該物件支援的介面,你的應用程式或其他物件就能夠確定第一個物件所能的服務。所有COM物件都繼承的一個方法是Query介面方法,它讓你確
定一個物件支援的介面和建立這些介面的指標。
1.2、IUnknown 介面
  所有的介面都由一個稱為Iunknown的介面衍生而來,該介面為DirectX提供了物件生存期的控制和操作多介面發能力。Iunknown含有三個方法:
 .AddRef  當一個介面或另一個應用捆綁到一個物件上時,就使用AddRef方法將該物件的值加1。
 .QueryInterface  透過指向特定介面的指標查詢物件所支援的特性。
 .Release  將物件的索引值減1,當索引值變為0時,該物件就從記憶體中釋放。
  其中AddRef和Release方法負責維護物件的索引值。例如,如果建立一個DirectDrawSurface物件,該物件的索引值就被設定為1,每次當有一個函式返回該物件的指標時,該函式必須透過返回髮指標AddRef方法將該物件的索引值加1。每一個AddRef的呼叫都必須有一個Release的呼叫與其對應。當物件的索引值達到0時,該物件就被撤消,該物件的所有介面都不可再用。
  QueryInterface方法測定一個物件是否支援指定的介面,如果支援,QueryInterface就返回指向該介面的指標。然後你可以使用該介面包含的方法同物件通訊。如果QueryInterface成功地返回介面的指標,它會自動呼叫AddRef方法增加物件的索引值。在撤消介面指標之前必須呼叫Release來減少物件的索引值。
1.3、 DirectX COM 介面
  DirectX中的介面是用相當基本的COM程式設計建立的。表徵了裝置的物件的每個介面都由IUnknown COM介面派生而來,如IDirectDraw2、IDirectSound和IDirectPlay都是這樣。基本物件的建立工作由動態連結庫DLL中的特殊函式來處理。
  典型的情況是,DirectX物件模型為每個裝置提供了一個主物件。其它支援服務的物件由主物件派生而來。例如,DirectDraw物件就表徵了顯示介面卡。你可以利用DirectDraw來建立表徵顯示記憶體的DirectDrawSurface物件和表徵硬體調色盤的DirectDrawPalette物件。同樣道理,DirectSound物件表徵了卡,利用它可建立表徵音源的DirectSounuffer物件。
  除了能夠產生子物件外,裝置的主物件還能測定它所表徵的裝置的效能,如螢幕的大小和顏色數、音效卡是否支援波表合成等。
1.4、 C++和COM 介面
  對C++程式設計師來說,COM介面就象一個抽象的基類。在C++的基類中,所有的方法都定義為純虛的,這就意味著沒有任何程式碼同方法關聯在一起。純虛的C++函式和COM介面都使用一種稱為虛表(vtable)的裝置。一個虛表包含了應用於所給介面的所有函式的宣告。如果你想讓程式或物件使用這些函式,可以先用QueryInterface方法檢查物件存在的介面,獲取該介面的指標,呼叫QueryInterface後,應用或物件實際上就從物件中接收到了虛表的指標,透過該指標就可以呼叫應用於該物件的所有介面方法。
  COM物件和C++的另一個相似之處是方法的第一個引數就是介面或類的名字,C++中稱為this引數。因為COM物件和C++物件是完全二進相容的,就將COM介面同C++抽象類同樣處理,並且具有相同的語法,這會使得程式碼簡單一些。
1.5、 獲取新的介面
  部件物件模型不是透過改變存在的介面中的方法而是透過擴充套件包含有新特性的新介面來物件的功能。在保留已有的介面狀態的情況下,COM物件能夠自由擴充套件服務並維持同舊的應用相容。DirectX部件遵循這一原則,例如,DirectDraw部件支援IDirectDrawSurface 介面的三個版本: IDirectDrawSurface、IDirectDrawSurface2和IDirectDrawSurface3。要想利用新介面提供的特性,你必須呼叫物件的
IUnknown::QueryInterface方法,指定欲獲取的介面的全域性統一標識GUID(globally unique ntifier)。介面的GUID在相關的標頭檔案中宣告。
下面的例子說明了如何查詢一個新的介面:
  LPDIRECTDRAW  lpDD1;
  LPDIRECTDRAW2  lpDD2;

  ddrval = DirectDrawCreate( NULL, &lpDD1, NULL );
  if( FAILED(ddrval))
  goto ERROROUT;

  // Query for the IDirectDraw2  Interface
  ddrval = lpDD1->Query介面(IID_IDirectDraw2, (void **)&lpDD2);
  if( FAILED(ddrval))
  goto ERROROUT;
 
  // Now that we have an IDirectDraw2, release the original Interface
  lpDD1->Release();
  新的介面不支援以前版本介面所提供的方法的情況極少,IDirect3DDevice2介面剛好是這樣的一個介面。如果你的應用需要早期版本的介面提供的特性,你可以利用老的介面的GUID,使用上述例程來查詢該介面。
1.6、 用C存取COM物件
  使用C語言也可以呼叫任何COM介面方法。用C語言呼叫一個介面方法需要主要兩件事:
 .方法的第一個引數始終是已經建立的呼叫該方法的物件(即this)
 .介面中的每個方法都透過物件虛表的指標來引用
下面的例子使用C語言呼叫IDirectDraw2::CreateSurface方法建立一個同一個DirectDraw物件關聯的表面:
 ret = lpDD->lpVtbl->CreateSurface (lpDD, &ddsd, &lpDDS,
  NULL);
 
  其中 lpDD引數是同新表面關聯的DirectDraw物件,同時,該方法填充一個描述表面(Surface)的結構&ddsd,返回指向新介面&lpDDS的指標。呼叫 IDirectDraw2::CreateSurface方法,首先要指向該DirectDraw物件的虛表,然後獲取虛表中的方法。方法中提供的第一個引數是已經建立的DirectDraw 物件的索引。下面的程式碼說明了C和C++對COM物件方法呼叫的不同之處:
ret = lpDD->CreateSurface(&ddsd, &lpDDS, NULL)
 
二、DirectX 5中的新內容
  大家知道, DirectX 5是DirectX的最新版本,在此之前,Microsoft曾釋出過DirectX、DirectX2、DirectX3(沒有DirectX4)。顯然,DirectX 5比DirectX3提供了更多的功能和服務,不過,利用DirectX3 API寫的程式不需要修改就可以成功地編譯和執行。下面是DirectX5和DirectX3的主要不同之處:
2.1、DirectDraw  
  DirectDraw擴充套件了新的影片埠能力,允許應用程式控制從硬體影片埠傳送到顯示記憶體中的DirectDraw表面的資料流。另外,DirectDraw 硬體模擬層HEL(Hardware Emulate Layer)能夠利用Pentium MMX提供的加速效能。DirectDraw在你第一次建立一個表面時會檢測處理器是否MMX處理器,在非奔騰處理器的計算機上,該測試會導致器報告出一個事件,該事件不會影響程式的效能和穩定性。
DirectDraw支援比主表面(Primary Surface)更寬的屏外表面(Off-screen Surface),只要硬體允許,你可以建立足夠寬的表面。
  DirectDraw支援高階圖形埠AGP(Advanced Graphics Port)特性。在一個AGP裝置系統,你可以在非本地顯示記憶體建立表面。DDSCAPS結構支援標準(本地)顯示記憶體和AGP(非本地)顯示記憶體之間不同的標誌。DirectDraw 可以向非本地顯示記憶體位塊傳輸DDCAPS結構包含的成員資訊。
2.2、DirectPlay
  DirectPlay包含了一個新的介面IDirectPlay3,除了新的方法之外,其它同IDirectPlay2完全相同。同樣地,IDirectPlayLobby2也是IdirectPlayLobby的升級版本。DirectPlay的新功能包括透過建立連線快捷方式來隱藏服務提供者(Service Provider)對話的能力,還可以保持可用會話的更新列表,應用SetSessionDesc方法更好地支援口令保護會話,支援保密服務連線及使用CoCreateInstance直接建立多個
DirectPlay物件。
2.3、DirectSound
  DirectSound 包含了一個新的介面IksPropertySet,使得支援由音效卡和相關驅動程式提供的擴充套件服務。基於COM的函式DirectSoundCapture也是新的,它可以直接訪問驅動程式。
2.4、Direct3D
  Direct3D即時模式(Immediate Mode)現在支援Drawing Primitive,而不必直接在緩衝區中工作。Direct3D保留模式(Retained Mode)
支援插值使你能夠調和顏色,平滑地移動物體,變形網格,並且執行許多其他的變換。保留模式也支援漸進網格,即允許你先開始於一個粗糙的網格,然後再細化它。
5、DirectInput
  DirectInput提供了操縱桿的COM介面,同時還提供了鍵盤和滑鼠等力反饋裝置的COM介面。
6、DirectSetup
  DirectSetup現在包含了更多的介面定製能力,而這是由一個回撥函式提供的。該回撥函式將當前的安裝狀態傳遞給安裝程式,你可以透過定製的使用者介面利用這一資訊來顯示安裝狀態。另外,DirectSetup提供了多個玩家的遊戲的方法,在遊戲中,玩家可以使用DirectPlayLobby從登錄檔中去掉註冊資訊。
6、AutoPlay AutoPlay同DirectX3中一樣,未做變動。


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

相關文章