?? dx5.txt
字號:
以通過定制的用戶接口利用這一信息來顯示安裝狀態。另外,DirectSetup提供了多個玩家的游戲的方法,在游戲中,玩家可以使用
DirectPlayLobby從注冊表中去掉注冊信息。
6、AutoPlay AutoPlay同DirectX3中一樣,未做變動。
DirectX5.0最新游戲編程指南
DirectDraw篇
DirectDraw是DirectX SDK的主要部分之一,它允許你直接對顯示內存操作,支持硬件位塊傳輸、硬件覆蓋、表面翻轉,并且保持同目
前的基于Windows的應用程序和驅動程序兼容。
DirectDraw是一種軟件接口,它除了能直接對顯示設備存取外,還保持同Windows圖形設備接口GDI(Graphics Device Interface)兼容。
對于圖形來說,它并不是一種高級應用程序接口。DirectDraw提供了一種設備無關性的方法,使得基于Windows的應用軟件和游戲(例如
三維圖形軟件包和數字視頻游戲)能直接獲取顯示設備的特性。
DirectDraw能工作于各種各樣的顯示設備,從簡單的SVGA顯示器到能夠提供剪切、拉伸和非RGB格式支持的高級顯示設備。DirectDraw
接口使得你的應用程序能仿真基本硬件的性能并使用硬件加速特性;硬件不提供的特性將由DirectX來仿真。DirectDraw提供的對顯示內存
的設備無關性的訪問能使你很容易地管理顯示內存。你的應用程序只需要識別一些基本的設備屬性,它們都是標準的硬件應用,例如RGB
和YUV格式的顏色。你不需要調用特殊的過程來使用位塊傳輸或操縱調色板寄存器。使用DirectDraw,你可以很容易地操作顯示內存,充
分利用不同類型顯示設備的位塊傳輸和顏色解壓功能,而不需要依賴于特定的硬件。DirectDraw可以運行在Windows95/NT4.0和以后的版本
中。
DirectDraw的硬件抽象層HAL(Hardware Abstraction Layer)提供了統一的接口,通過該接口,程序可以直接在顯示內存或視頻內存中
工作,獲取硬件的最佳性能。
DirectDraw對視頻硬件的性能進行估計,只要可能就會使用硬件提供的特定性能。例如,如果視頻卡支持位塊傳輸,DirectDraw就會把
位塊傳輸委托給視頻卡,CPU不參與位塊傳輸的處理,這就大大提高了程序運行的性能。另外,DirectDraw提供了硬件仿真層HEL(Hardware
Emulation Layer ),使得在某些硬件不存在時可以用軟件仿真來支持本應該由這些硬件提供的特性。
DirectDraw運行在Windows 95上,能夠利用32位內存的優越性和操作系統提供的“平坦”內存模型。DirectDraw將系統內存和視頻內
存作為大塊存儲而不是一小段一小段地使用。另外,DirectDraw還為 Windows圖形程序員帶來了許多強大的功能:
.DirectDraw使得在全屏模式下的應用多個后臺緩沖區的頁翻轉變得容易
.支持窗口模式和全屏模式下的剪切功能
.支持三維 Z緩沖區
.支持Z方向的硬件輔助覆蓋
.提供對圖象拉伸的硬件的存取
.同時訪問標準的和增強的顯示設備內存區域
.動態調色板、獨占式的硬件訪問、分辨率切換等
將這些特性結合在一起,你就可以較容易地編制出性能超過基于GDI的標準Windows游戲甚至是MS-DOS下的游戲。
一、DirectDraw的基本圖象概念
DirectDraw提供了一組不同于GDI的圖形術語,因此,要用好DirectDraw,首先應該了解其中的有關概念。下面就對DirectDraw中重
要的概念作一介紹。
1.1設備無關性位圖DIB(Device-Independent Bitmap)
DirectX使用設備無關性位圖DIB作為主要的圖形文件格式。一個DIB文件主要保護了如下信息:圖象的維數、使用的顏色數、描述
顏色的值及描述每一個像素的數據。DIB文件還保護了較少用到的參數,象有關文件壓縮的信息和圖象的物理維數。DIB文件的擴展名一般
是“.BMP”,有時也可能是“.DIB”。
因為DIB在Windows編程中的應用極其廣泛,DirectX SDK已經包含了許多相關的函數。例如,DirectX SDK提供的ddutil.cpp文件中
有一個函數,它將Win32和DirectX函數結合在一起,概念是把一個DIB文件裝入DirectX表面,代碼如下:
extern "C" IDirectDrawSurface * DDLoadBitmap(IDirectDraw *pdd,
LPCSTR szBitmap, int dx, int dy)
{
HBITMAP hbm;
BITMAP bm;
DDSURFACEDESC ddsd;
IDirectDrawSurface *pdds;
// This is the Win32 part.
// Try to load the bitmap as a resource, if that fails, try it as a file.
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION);
if (hbm == NULL)
hbm = (HBITMAP)LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if (hbm == NULL)
return NULL;
// Get the size of the bitmap.
GetObject(hbm, sizeof(bm), &bm);
// Now, return to DirectX function calls.
// Create a DirectDrawSurface for this bitmap.
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = bm.bmWidth;
ddsd.dwHeight = bm.bmHeight;
if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK)
return NULL;
DDCopyBitmap(pdds, hbm, 0, 0, 0, 0);
DeleteObject(hbm);
return pdds;
}
1.2、繪圖表面(Drawing Surface)
繪圖表面接受視頻數據并將其作為圖象顯示出來。在大多數的Windows應用程序中,你可以使用Win32的函數如GetDC來訪問繪圖表
面。GetDC獲取設備上下文DC(Device Context),獲得了設備上下文后,就可以重畫表面了。然而,Win32的圖象函數是由GDI提供的。
GDI是系統的一部分,它提供了抽象層,使得標準的Windows程序向表面繪圖。
GDI的缺點是它并不是為高性能的多媒體軟件設計的,它主要用于商業軟件如字處理和電子表格軟件。GDI提供了對系統內存中的視頻
緩沖區的訪問,但不提供對視頻內存的訪問。盡管GDI對于大多數的商業軟件非常合適,但對于多媒體應用程序和游戲軟件則顯得太慢了。
另一方面,DirectDraw 能提供表征真實視頻內存的繪圖表面,這就意味著當你使用DirectDraw 時,你能夠直接向視頻內存寫數據,使
得圖象的顯示速度足夠快。這些表面表征為連續的內存塊,使得尋址時更加容易。
1.3、位塊傳輸Blit
Blit是“Bit Block Transfer”的簡寫,表示位塊傳輸。它是將內存中一個地址的一塊數據傳送到另一個地址的一種方法。位塊傳輸經常用
于精靈動畫中。你可以使用IDirectDrawSurface3::Blt 方法和IDirectDrawSurface3::BltFast方法來執行位塊傳輸。
1.4、頁翻轉(Page Flipping)和后臺緩沖(Back Buffering)
頁翻轉是多媒體、動畫、游戲軟件中的關鍵。軟件頁翻轉是對卡通畫家使圖象運動的過程的模擬。例如,畫家在一張紙上畫了一個人物,
然后將其置于下一幀的工作狀態,對于每一幀,只很少地改變人物圖象。當你快速翻轉紙片時,連續的人物圖象看起來就成了動畫。
軟件中的頁翻轉類似于上述的過程。首先,你建立了一系列DirectDraw表面,這些設計好的表面準備“翻轉”到屏幕。第一個表面被看
作是主表面(Primary Surface),在主表面后的所有表面都稱為后臺緩沖區。應用程序將數據寫向后臺緩沖區,然后翻轉主表面,于是后臺緩
沖區就顯示在片面上了。當系統正在顯示圖象時,程序就可以向后臺緩沖區寫數據,這個過程一直持續到動畫的結束,它使你快速而高效地
將離散的圖象變成動畫。 DirectDraw可以利用相對簡單一些的雙緩沖區(一個主表面和一個后臺緩沖區),也可以使用較復雜的技術,加入
其它的后臺緩沖區。使得你能夠容易地建立頁翻轉的程序。
1.5、矩形(Rectangle)
貫穿DirectDraw和Windows編程的一個最重要的概念是表面上的對象──有界矩形。一個有界矩形由兩個點來確定,即左上角和右下
角。當以位塊傳輸的方式向屏幕寫數據時,大多數的應用程序都使用RECT結構來傳送有關有界矩形的信息。RECT結構的定義如下:
typedef struct tagRECT {
LONG left; // This is the top-left corner's X-coordinate.
LONG top; // The top-left corner's Y-coordinate.
LONG right; // The bottom-right corner's X-coordinate.
LONG bottom; // The bottom-right corner's Y-coordinate.
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
其中left和top成員變量是矩形左上角的X、Y坐標的值,right和bottom是右下角的X、Y的坐標值。
1.6、精靈(Sprite )
許多視頻游戲都使用了精靈。從最基本的意義上來講,一個精靈就是在屏幕上移動的圖象。精靈畫在一個表面上,覆蓋在已有的背景上,
合成后的圖象被送到屏幕上顯示出來。
1.6.1、透明位塊傳輸(Transparent Blitting)和Color Key
精靈動畫中的難點在于對非標準矩形的精靈的處理。因為位塊傳輸函數是工作在矩形方式下,你的精靈也必須放在一個矩形之中,而不
管它在屏幕上是否矩形。
精靈圖象本身不是矩形的,但卻包含在矩形區域中。當用位塊傳輸將圖象移動到目的地時,矩形區域中不屬于精靈的像素就被“透明”
處理。程序員選擇任意一種顏色來創建精靈,這種顏色就被用來作為透明度“Color Key”。它是一種不常用的顏色,程序員僅僅用于表示透
明度或特定的顏色范圍。
使用IDirectDrawSurface3::SetColorKey方法,你可以為一個表面設定Color Key。設置了Color Key后,調用 IDirectDrawSurface3::BltFast
方法來使用已設好的Color Key,而不管像素是否同該Color Key匹配。這種類型的Color Key是源 Color Key。源Color Key禁止“透明”的
像素寫到目的地,這樣,原來的背景像素就保留下來了,使得精靈看起來就是非矩形的了并且精靈還可以在背景上移動。
另外,你還可以使用一個Color Key來影響目的表面(目的Color Key)。目的Color Key也是表面上的一種顏色,它用于指明像素是否
可以被精靈所覆蓋。
1.6.2、精靈和修補矩形(Sprite and Patch Rectangle)
為了產生精靈運動的效果,你在將精靈畫到新的位置之前還必須從背景上擦除舊的位置上的精靈圖象。當然,也可以重新調入整個背景
再重畫精靈,但這會大大降低動畫的質量。事實上,你可以保留精靈矩形的上一次的軌跡,僅對該位置重畫。這種方法稱為“修補”(Patching)。
為了修補精靈舊的位置,可以利用原始背景圖象(已經調入到一個屏外表面)的一個拷貝來重畫這一位置。在這個過程中使用的是位塊傳輸
方法,在整個表面的循環中進行,需要耗用的處理時間很少。下面是這一過程的簡單步驟:
(1). 設置精靈上一次位置的修補矩形
(2). 使用位塊傳輸將屏外表面中的背景圖象的主拷貝補到該位置
(3). 更新精靈是目的矩形,它反映了精靈新的位置
(4). 將精靈位塊傳輸到背景上最新更新的矩形位置
(5).重復
將DirectDraw提供的強大的圖象功能同直線式的C/C++程序結合起來,利用上面的步驟,馬上就可以創建一個簡單的精靈動畫。
1.6.3、邊界檢查和碰撞檢測(Bounds Checking and Hit Detection)
在精靈動畫中,邊界檢查和碰撞檢測是兩個非常車間而又相當重要的任務。邊界是限制精靈活動的范圍,邊界檢查就是通過RECT結構
來檢查精靈的位置,判斷精靈是否超出了限定的范圍。
碰撞檢測就是檢查多個精靈是否占用了同一個位置。大部分的碰撞檢測是檢查各個精靈的矩形之間是否有所覆蓋。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -