DircetDraw c/c++ 使用指導(四) (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DircetDraw c/c++ 使用指導(一) (轉)C++
- DircetDraw c/c++ 使用指導(三) (轉)C++
- DircetDraw c/c++ 使用指導(二) (轉)C++
- [C++]指標和引用(四)C++指標
- C++指標轉換C++指標
- 高中生學習c/c++指導C++
- C++標準庫有四種智慧指標C++指標
- C/C++指向指標的指標C++指標
- C++ this 指標C++指標
- C++ 指標C++指標
- Google C++程式設計風格指南(四):智慧指標和其他C++特性GoC++程式設計指標
- C++中智慧指標的簡單使用C++指標
- 【C++】智慧指標的正確使用方式C++指標
- C++指標理解C++指標
- 【c++】智慧指標C++指標
- C++智慧指標C++指標
- C/C++指標總結C++指標
- C++中智慧指標的設計和使用C++指標
- C++入門解惑(2)——初探指標(上) (轉)C++指標
- C++入門解惑(3)——初探指標(下) (轉)C++指標
- c++指標使用經驗總結之懸垂指標C++指標
- c++四種強制型別轉換C++型別
- 學習C++(VC)四步曲 (轉)C++
- C++中的this指標C++指標
- c++ 函式指標C++函式指標
- C++引用和指標C++指標
- C++指標問題C++指標
- 「C++」理解智慧指標C++指標
- c++指標小計C++指標
- C++(函式指標)C++函式指標
- 劍指offer——把字串轉換成整數C++字串C++
- C++深度探索系列:智慧指標(Smart Pointer) [二] (轉)C++指標
- Git使用指導Git
- C++學習四C++
- 關於C/C++ void指標,使用void指標拷貝int 陣列C++指標陣列
- 詳解c++指標的指標和指標的引用C++指標
- C++程式設計雜談:物件導向 (轉)C++程式設計物件
- C++程式設計思想筆記之四 (轉)C++程式設計筆記