DircetDraw c/c++ 使用指導(四) (轉)

gugu99發表於2008-05-25
DircetDraw c/c++ 使用指導(四) (轉)[@more@]

DircetDraw c/c++ 使用指導


310cdt 譯

 

(不過這兩天不知怎的不怎麼好使,過兩天可能會好)

tutorial4:色彩鍵碼和點陣圖動畫
第三篇指導的例子ddex3演示了一個簡單的在翻轉頁面前把點陣圖放到離屏快取的行為.這篇指導的例子將利用前面描述的技術,裝載一個背景圖片和一系列的精靈(譯者注:一般放置小幅的不斷改變的圖片)到離屏表面中.然後,使用IDirectDrawSurface7::BltFast方法複製離屏表面的一部分到後臺緩衝,以次,產生一個簡單的點陣圖動畫.
ddex4用到的點陣圖是all.bmp,它包含了背景和60個連續的黑背景的旋轉的紅圈.DDEx4包含了新的,用來為旋轉紅圈精靈設定色彩鍵碼.然後,例子從離屏表面中複製適當的精靈到後臺緩衝.
DDEx4中新添的函式演示如下:
step1:設定色彩鍵碼
step2:建立一個簡單的動畫
(譯者注:色彩鍵碼就是設定了的,在從離屏表面向緩衝複製的時候不複製的色彩,從而形成透明的樣子)

step1:設定色彩鍵碼
在其他例子的基礎上,ddex4的doInit函式包含了設定精靈色彩鍵碼的程式碼.色彩鍵碼是用來設定一個色彩值,這個色彩值是用於透明的.當使用塊移動支援時,所有的畫素中除了設為色彩鍵碼的顏色的,都將被塊移動(blit)到快取.這樣就建立了一個不是矩形樣子的精靈.下面的程式碼演示了DDEx4中如何設定色彩鍵碼的.

// Set the color key for this bitmap (black).
DDSetColorKey(lpDDSOne, RGB(0,0,0));
 
return TRUE;
在DDSetColorKey函式的的時候,你可以設定你想設的顏色的RGB值來設定色彩鍵碼.黑色的RGB值是(0,0,0).DDSetColorKey函式呼叫了DDColorMatch函式.(兩個函式都在ddutil.cpp中) DDColorMatch函式儲存了在lpDDSOne表面中的點陣圖的(0,0)位置的畫素的顏色值.然後,他把點陣圖的(0,0)位置的畫素設為你提供的那個顏色.最後,它求了顏色值和每個畫素色彩位數的掩碼(異或).使(0,0)位置變回了原來的顏色,當這些都做完後,函式呼叫完返回到DDSetColorKey中.返回了色彩鍵碼的值(dw)值.放在了DDCOLORKEY結構的成員dwColorSpaceLowValue中,並被複製到dwColorSpaceHighValue成員中.隨後IDirectDrawSurface7::SetColorKey的呼叫設定了色彩鍵碼.
你可能已經注意到了DDSetColorKey和DDColorMatch函式中的CLR_INVALID了.如果在DDEx4中你把CLR_INVALID當作色彩鍵碼傳遞給DDSetColorKey函式,點陣圖中的左上角(0,0)畫素將被當作色彩鍵碼.DDEx4中這個意義不大,因為點陣圖的(0,0)位置是灰色的.你要是想看看怎樣在ddex4中讓(0,0)位置作為色彩鍵碼,你可以用繪圖開啟all.bmp檔案.然後把(0,0)這個點改為黑色.一定要保證你把修改儲存好了(這個不好看出來).然後,你可以把DDSetColorKey的呼叫改成下面這樣:
DDSetColorKey(lpDDSOne, CLR_INVALID);

重新編譯ddex4,保證包含了新點陣圖的資原始檔也重新編譯過了.這樣,ddex4將用那個現在已經被改為黑色的(0,0)點作為色彩鍵碼了.


step2:建立一個簡單的動畫
ddex4用到了updateFrame例子函式建立了一個簡單的動畫,用的是all.bmp中包含的那些紅圈.這個動畫由三個呈三角形位置的以不同速度轉動的紅圈組成.例子中透過比較 GetTickCount函式和上一次呼叫GetTickCount函式到現在的毫秒數來決定是否重繪精靈.然後,使用IDirectDrawSurface7::BltFast方法把背景從離屏表面(lpDDSOne)中塊移動(blit)到後臺快取,並且把精靈們也塊移動到後臺快取,這是要用到你剛才設定的色彩鍵碼決定哪些畫素是透明的.當精靈們移動到後臺快取後,就呼叫IDirectDrawSurface7::Flip方法翻轉頁面.
注意當你用IDirectDrawSurface7::BltFast方法塊移動背景的時候,dwTrans引數定義了傳送的引數是DLTFAST_NOCOLORKEY.這個標示了將是一個沒有透明的普通塊移動.後來,當紅圈被塊移動的時候,dwTrans引數設為DDBLTFAST_SRCCOLORKEY.這個標示了塊移動將用到定義了的色彩鍵碼,以實現透明的效果.在這個例子中,是對lpDDSOne快取.
在這個例子中,每次呼叫updateFrame函式都將重繪全部背景.這個例子的一個方法是,只重繪紅圈旋轉所引起的背景發生變化的那一小部分.因為放置紅圈精靈的位置和大小都是不變得,所以,你可以很簡單的修改ddex4以達到這個最佳化.


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

相關文章