• 沒有找到結果。

顯示頁的建立

在文檔中 電腦遊戲程式設計 (頁 65-68)

第三章 WINDOWS 電玩程式

3.4 顯示頁的建立

3.4.1 平面

平面是有一堆記憶體來畫那些 COM 物件 IDirectDrawSurface 衍生得物件。平 面儲存影像在記憶體中,可以對它們進行運算。舉例來說,一個獨立的平面用來 儲存在動畫風景中各個圖形物件(SPRITE),接著畫到每一個相對的平面已構成完 成的影像。

3.4.1 平面建立

建立一個平面相當簡單,你只要田好一個苗速希望建立平面的 DDSURFACEDESC 結構及可以了。

下圖是 DDSURFACEDESC 結構的詳細資料。

型態 名稱 意義

DWORD dsSize 結構的大小(用 sizeof 得到位元數) DWORD dwFlags 用來設定特定的 enable/disable DWORD dwHeight 平面的高度

DWORD dwWidth 平面的寬度

LONG Ipitch 記憶體中,一個水平到下一常的像 數量

DWORD dwBackBufferCount 相連結的 back 緩衝區數量 DWROD dwzBufferBitDepth Zbuffer 的深度(以像素為單位) DWORD dwAlphaBitDepth alpha buffer 的深度(以像素為單位) LPVOID lpSurface 指向平面記憶體的指標

DDCOLORKEY ddckCKDestOverlay 目標 overlays 時的顏色 DDCOLORKEY ddckCKDestBlt 目標 blits 時的顏色 DDCOLORKEY ddckCKSrcOverlay 來源 overlays 時的顏色 DDCOLORKEY ddckCKSrcBlt 來源 blits 時的顏色 DDPIXELFORMAT ddpixelformat 平面的像素格式

DDSCAPS ddsCaps 決定平面提供的能力

圖 3-1 DDSURFACEDESC 結構

當要建立一個新的平面時,必須先初始化 dwSize 成員,接著用 OR(|)運算元 來合成 dwFlags 成員這個 DWORD 值,dwFlags 成員告訴 DirectDraw 在

DDSURFACEDESC 結構中哪一些儲存值有效。在 DDSURFACEDESC 結構中的每 一個成員都有唯一的 DWORD 值(圖 pic.3-2)來讓 dwSize 和 dwFlags 使用。這個方

法節省了很多時間,因為只需要填入真正要使用到的成員。

通常建立一個新的平面時你只會填入 dwHeight、dwWidth、dwCaps、ddsCaps 這些成員,其它成員是用來建立特別的平面。

當使用 DDSURFACEDESC 的時候,ddsCaps 這個成員非常重要,它會告訴 CreateSurface 要建立哪種平面。DdsCaps 本身則屬於 DDSCAPS 結構,這種結構只 有一個 DWORD 型態的參數----dwCaps,dwCaps 的值有很多種,每一種都苗速不 同的平面,這一些值通常要結合在一起,才能建立一些獨特的特性和功能。

接下來是 CreateSurface()這個函式的用法。

HRESULT CreateSurface(LPDDSURFACEDESC

lpDDsurfaceDesc,LPDIRECTDRAWSURFACE FAR * lplpDDSurface,Iunknown Far * pUnkOuter);

CreateSurface()有三個參數:

(1) lpDDSurFaceDesÎ一個指向一個 DDSURFACEDESC 結構的指標,這個結構是 有關你所建立之平面的資訊。

(2) lplpDDSurFaceÎ一個指向一個 DirectDrawSurface 物件,這個物件位新建立的 平面所初始化。

(3) pUnkOuterÎ沒有用的 NULL 值。

註:DirectDraw 除非在沒有足夠的空間的情況下,或是你明確要求儲存在一般就系 統的 RAM,中否則往往會將新的平面放到影像記憶體中。

DDSD_DDSCAPS ddsCaps DDSD_HEIGHT dwHeight DDSD_WIDTH dwWidth DDSD_PITCH Ipitch DDSD_BACKBUFFERCOUNT dwBackBufferCount DDSD_ZBUFFERDEPTH dwZBufferDepth DDSD_ALPHABITDEPTH dwAlphaBltDepth DDSD_LPSURFACE lpSurface DDSD_PIXELFORMAT ddpfPixelFormat DDSD_CKDESTOVERLAY ddCKDestOverlay DDSD_CKDESTBLT DdCKDestBlt DDSD_CKSRCOVERLAY DdCKSrcOverlay DDSD_CKSRCBLT DdCCKSrcBlt

DDSD_ALL 使用所有成員

圖 3-2 dwFlags 值以及相對應的 DDSURFACEDESC 成員

3.4.2

主要平面(Primary Surface)

主要平面是在螢幕上可見部分的影像記憶體區塊,如果遊戲有使用 GDI 的畫 那它也可以被 GDI 所共享。如果遊戲是視窗模式而非全螢幕模式的話,GDI 一樣 可以共享主要平面,因為 GDI 需要在 Z-order 較下方的視窗(下面的視窗)做從畫的 動作。

要建立主要平面,先要填入一個 DDSURFACEDESC 結構。我們將

DDSCAPS_PRIMARYSURFACE 值放入 DDSURFACEDESC 的 ddsCaps.dwCaps 成 員,DDSCAPS_PRIMARYSURFACE 會告訴 CreateSurface 要建立一個主要平面,

其實還有很多值 DDSCAPS_PRIMARYSURFACE 出現。

註:當你要建立一個主要平面時,不要將 DDSURFACEDESC 的高度和寬度成員填 入任何值,因為主要平面的大小永遠是顯示器的大小,你必須要藉由改變影像模 式才能達到改變主要平面的大小的效果。

在文檔中 電腦遊戲程式設計 (頁 65-68)

相關文件