| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

來源:互聯網網民  2006-12-17 09:28:29  評論

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

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

310cdt 譯

ddex4(不過這兩天不知怎的服務器不怎麽好使,過兩天可能會好)

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中包含的那些紅圈.這個動畫由三個呈三角形位置的以不同速度轉動的紅圈組成.例子中通過比較win32 GetTickCount函數和上一次調用GetTickCount函數到現在的毫秒數來決定是否重繪精靈.然後,使用IDirectDrawSurface7::BltFast方法把背景從離屏表面(lpDDSOne)中塊移動(blit)到後台緩存,並且把精靈們也塊移動到後台緩存,這是要用到你剛才設置的色彩鍵碼決定哪些像素是透明的.當精靈們移動到後台緩存後,就調用IDirectDrawSurface7::Flip方法翻轉頁面.

注意當你用IDirectDrawSurface7::BltFast方法塊移動背景的時候,dwTrans參數定義了傳送的參數是DDBLTFAST_NOCOLORKEY.這個標示了將是一個沒有透明的普通塊移動.後來,當紅圈被塊移動的時候,dwTrans參數設爲DDBLTFAST_SRCCOLORKEY.這個標示了塊移動將用到定義了的色彩鍵碼,以實現透明的效果.在這個例子中,是對lpDDSOne緩存.

在這個例子中,每次調用updateFrame函數都將重繪全部背景.優化這個例子的一個方法是,只重繪紅圈旋轉所引起的背景發生變化的那一小部分.因爲放置紅圈精靈的位置和大小都是不變得,所以,你可以很簡單的修改ddex4以達到這個優化.

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
DircetDraw c/c++ 使用指導(四) DircetDraw c/c++ 使用指導(四) DircetDraw c/c++ 使用指導 310cdt 譯 ddex4(不過這兩天不知怎的服務器不怎麽好使,過兩天可能會好) 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中包含的那些紅圈.這個動畫由三個呈三角形位置的以不同速度轉動的紅圈組成.例子中通過比較win32 GetTickCount函數和上一次調用GetTickCount函數到現在的毫秒數來決定是否重繪精靈.然後,使用IDirectDrawSurface7::BltFast方法把背景從離屏表面(lpDDSOne)中塊移動(blit)到後台緩存,並且把精靈們也塊移動到後台緩存,這是要用到你剛才設置的色彩鍵碼決定哪些像素是透明的.當精靈們移動到後台緩存後,就調用IDirectDrawSurface7::Flip方法翻轉頁面. 注意當你用IDirectDrawSurface7::BltFast方法塊移動背景的時候,dwTrans參數定義了傳送的參數是DDBLTFAST_NOCOLORKEY.這個標示了將是一個沒有透明的普通塊移動.後來,當紅圈被塊移動的時候,dwTrans參數設爲DDBLTFAST_SRCCOLORKEY.這個標示了塊移動將用到定義了的色彩鍵碼,以實現透明的效果.在這個例子中,是對lpDDSOne緩存. 在這個例子中,每次調用updateFrame函數都將重繪全部背景.優化這個例子的一個方法是,只重繪紅圈旋轉所引起的背景發生變化的那一小部分.因爲放置紅圈精靈的位置和大小都是不變得,所以,你可以很簡單的修改ddex4以達到這個優化.
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有