Visual C 遊戲程式設計基礎之透明半透明效果

2021-09-23 20:52:03 字數 3228 閱讀 8510

1.半透明的原理

一張點陣圖由許多畫素組成,而每一畫素包含r、g、b三原色,三原色的值決定了畫素的色彩,要實現半透明效果,需要把前景圖    和背景圖彼此對應的畫素顏色按某一比例進行調配,稱為 『不透明度』,直接貼圖,則前景圖不透明度為100%,背景圖為0%;

公式:半透明圖色彩=前景圖色彩 * 不透明度 + 背景圖色彩 * (1-不透明度)

2.半透明操作步驟

(1)取得位圖結構,需要使用getobject函式,介紹如下:

函式原型:int getobject(hgdiobj hgdiobj, int cbbuffer, lpvoid lpvobject);

函式功能:表示獲取點陣圖的資訊

引數一   : 要獲取的點陣圖控制代碼

引數二   : 指定將要寫到緩衝區的資訊的位元組數目,在這裡是點陣圖型別的位元組數 

關於位圖結構bitmap介紹如下:

(2)建立暫存陣列,目的是為了儲存點陣圖中所有畫素的顏色值

unsigned char * px1 = new unsigned char [bm1.bmheight * bm1.bmwidthbytes];

其中陣列的大小即為整個位圖所有畫素佔的位元組數,若乙個畫素24bits,則佔3個位元組,也就是3個陣列元素

(3)取得點陣圖中所有的顏色值,並儲存到暫存陣列中,函式介紹如下:

函式原型:long getbitmapbits(hbitmap hbmp, long cbbuffer, lpvoid lpvbits);

函式功能:把點陣圖的色彩值儲存到暫存陣列中

引數一   :位圖控制代碼

引數二   :要取得的位元組數

引數三   :指向暫存陣列

(4)合成畫素顏色值,這裡介紹基本思想:

假設每個畫素24bit,則每個畫素佔3位元組,關於背景圖,首先要取得整張影象素各原色值所在的索引值,即:

for(y=ystart;y舉個簡單的例子,假設從(xstart,ystary)~(xend,yend) 為 (0,0)~(1,1),則有如下情況:

[0][1][2]   [3][4][5]

[6][7][8]   [9][10][11]

注釋:每個畫素佔3個位元組;每一列畫素佔6位元組,書裡都把行稱為列,也不知道為啥 

同理:處理前景圖時,直接進行顏色合成:前景圖30%的不透明度+背景圖70%的不透明度,存放到px2

for(y=0;y

while (getmessage(&msg, null, 0, 0))

return msg.wparam;

}atom myregisterclass(hinstance hinstance)

bool initinstance(hinstance hinstance, int ncmdshow)

movewindow(hwnd,10,10,600,445,true);

showwindow(hwnd, ncmdshow);

updatewindow(hwnd);

bg = (hbitmap)loadimage(null,"bg.bmp",image_bitmap,600,400,lr_loadfromfile); //背景圖控制代碼

bmp = (hbitmap)loadimage(null,"girlmask.bmp",image_bitmap,766,345,lr_loadfromfile);//前景圖控制代碼

getobject(bg,sizeof(bitmap),&bm1); //get the message of image to bm1

if(bm1.bmbitspixel != 32 && bm1.bmbitspixel != 24) //bit of pixe l

hdc = getdc(hwnd);

mdc = createcompatibledc(hdc);//建立與視窗dc相容的記憶體dc "mdc"

bufdc = createcompatibledc(hdc);//建立與視窗dc相容的記憶體dc "bufdc",選擇前景圖或背景圖,貼到mdc作透明處理

girl = createcompatiblebitmap(hdc,383,345);//建立乙個與視窗相相容的空位圖"girl",298*329畫素,處理後就是要貼到視窗的透明半透明圖案

selectobject(mdc,girl);//girl 存到 mdc,在mdc上進行透明處理

selectobject(bufdc,bg);//bg replace bufdc,背景圖bg存入bufdc

bitblt(mdc,0,0,383,345,bufdc,xstart,ystart,srccopy);//將透明區域的背景圖貼到mdc中

selectobject(bufdc,bmp);//將包含遮蔽圖的前景圖存入bufdc

bitblt(mdc,0,0,383,345,bufdc,383,0,srcand);//遮蔽圖在整張圖中,左上角座標(298,0),遮蔽圖與背景圖and運算

bitblt(mdc,0,0,383,345,bufdc,0,0,srcpaint);//前景圖與背景圖or運算,得到透明後的前景圖,接下來進行半透明處理

unsigned char *px1,*px2;

px1 = new unsigned char [bm1.bmheight * bm1.bmwidthbytes];

getbitmapbits(bg,bm1.bmheight * bm1.bmwidthbytes,px1);//px1儲存位圖顏色值

getobject(girl,sizeof(bitmap),&bm2);//bme得到girl的全部資訊

px2 = new unsigned char [bm2.bmheight * bm2.bmwidthbytes];

getbitmapbits(girl,bm2.bmheight * bm2.bmwidthbytes,px2);//px2儲存點陣圖bm2的顏色值

Visual C 遊戲程式設計基礎之遊戲迴圈

1.函式原型 boolpeekmessage lpmsgipmsg,hwndhwnd,uintwmsgfiltermin,uintwmsgfiltermax,uintwremovemsg 功 能 用於檢測訊息,檢測到了就返回非0值,否則返回0 引數一 接收訊息資訊的msg結構指標 引數二 其訊息被檢...

Visual C 遊戲程式設計基礎之透明動畫

1.利用前面學過的透明處理,這一次相當於是對每一幀進行透明處理,如第一次迴圈對第一幀進行透明處理,接著顯示 第二次對第二幀透明處理,接著顯示,直到最後一幀,然後再從第一幀開始,就這樣無限迴圈 include stdafx.h hinstance hinst hbitmap dra,bg bg為背景圖...

Visual C 遊戲程式設計基礎之鍵盤訊息

1.虛擬鍵碼 windows系統下所有的按鍵被視為虛擬鍵 包含滑鼠在內 每乙個虛擬鍵都有其對應的虛擬鍵碼 2.鍵盤訊息 1 vm kewdown 按下按鍵訊息 2 vm keyup 鬆開按鍵訊息 3 vm char 字元訊息,當按下的按鍵為定義於ascii碼中的可列印字元時,便發出此字元訊息 3.系...