由于所有的圖文件都是以一個(gè)四方矩形來(lái)存儲(chǔ)的,但有時(shí)我們可能會(huì)需要把一張怪物圖片貼到窗口的背景圖上,而在這種情況下如果我們直接進(jìn)行貼圖,其結(jié)果如下圖所示:
這似乎不是所要的結(jié)果。在本篇隨筆中將要討論透明效果,就是要利用BitBlt()貼圖函數(shù)以及Raster值的運(yùn)算來(lái)將圖片中不必要的部分去掉(又稱去背),使得圖中的主體可以與背景圖完全融合。
制作透明效果有多種方法,但基本上都是利用貼圖時(shí)不同的Raster運(yùn)算,通過(guò)轉(zhuǎn)換而最后產(chǎn)生相同的透明效果。
以下面的恐龍圖為例子,首先必須準(zhǔn)備一張位圖,它的色彩分配如下所示
圖中左邊的圖是要去背并貼在背景圖上的前景圖,右邊的黑白圖稱為“屏蔽圖”,在透明的過(guò)程中會(huì)用到它。把要去背的位圖與屏蔽圖合并成同一張圖,透明的時(shí)候再按照需要來(lái)進(jìn)行裁切。可以把它分成兩張圖,但這樣程序必須運(yùn)行兩次圖文件加載的操作。
有了屏蔽圖就可以利用貼圖函數(shù)來(lái)產(chǎn)生透明效果了,所需進(jìn)行的貼圖步驟如下:
(1)將屏蔽圖與背景圖做“AND”(Raster的SRCAND)運(yùn)算,貼到目的地DC中。
(2)將前景圖與背景圖做“OR”(Raster的SRCPAINT)運(yùn)算,貼到目的地DC中。
為什么經(jīng)過(guò)上面的兩個(gè)步驟就能產(chǎn)生透明的效果呢?可以參看下圖:
接下來(lái)說(shuō)明上述兩個(gè)步驟所產(chǎn)生的圖點(diǎn)色彩的變化。
1、屏蔽圖與背景圖做“AND”運(yùn)算
(1)屏蔽圖中的黑色部分與背景圖做“AND”運(yùn)算

(2)屏蔽圖中的白色部分與背景圖做“AND”運(yùn)算

經(jīng)過(guò)這一運(yùn)算所產(chǎn)生的結(jié)果如圖20所示:
2、前景圖與背景圖做“OR”運(yùn)算
(1)前景圖中的彩色部分與圖20做“OR”運(yùn)算

(2)前景圖中的黑色部分與圖20做“OR”運(yùn)算

經(jīng)過(guò)這一運(yùn)算后所顯示的畫面就是所需的透明圖了,圖下圖所示
范例ch2_6:透明效果的顯示。
下載地址:
ch2_6(上傳到windows live空間,可能需要MSN賬號(hào)登陸)
說(shuō)明:程序源代碼中有相關(guān)的注釋。
程序運(yùn)行結(jié)果如下圖:
PS:如想獲得更多關(guān)于Visual C++游戲開(kāi)發(fā)的內(nèi)容,可點(diǎn)擊隨筆
:《Visual C++游戲編程基礎(chǔ)》學(xué)習(xí)筆記——索引隨筆。