發(fā)布時(shí)間:2023-12-11 17:50:47 瀏覽量:263次
有時(shí)候,我們需要在畫(huà)面上顯示一張角色的圖像,而這張圖片是有自己的背景的,要是直接貼到了游戲的畫(huà)面中,就會(huì)出項(xiàng)覆蓋游戲畫(huà)面。顯示出的效果特別不好,這里我們可以用到透明效果來(lái)處理。
其中,原理就是用BitBlt() 的Raster值運(yùn)算去掉原圖片的背影。但是只適用于原圖背景為黑色,才會(huì)看到效果。
如圖,左邊部分為前景圖,右邊部分為屏蔽圖
以下為顯示的背景圖
為了得到透明效果,我們需要運(yùn)用到BitBlt()貼圖函數(shù)以及其參數(shù)Raster的值來(lái)將圖片中不必要的部分去掉(又稱(chēng)去背),使得圖中的主題可以與背景完美融合。
制作透明效果有很多種方法,但是基本上都是利用貼圖時(shí)不同的Raster運(yùn)算,通過(guò)轉(zhuǎn)換而產(chǎn)生相同的透明效果。在這里先來(lái)介紹一種透明運(yùn)算的方法。
我們以圖中的恐龍為例子,首先準(zhǔn)備一張位圖,如下圖。
圖中的左邊的圖是要去背并貼到背景上的前景圖。右邊的黑白圖稱(chēng)為“屏蔽圖”,在透明的過(guò)程中會(huì)用到它。要把去背的位圖與屏蔽圖合并成同一張圖,透明的時(shí)候再按照需要來(lái)進(jìn)行裁切。可以把它分成兩張圖,但是這樣程序必須運(yùn)行兩次圖文件加載的操作。
有了屏蔽圖就可以利用貼圖函數(shù)來(lái)產(chǎn)生透明效果了,所需的貼圖步驟如下:
<1>將屏蔽圖與背景圖做"AND"運(yùn)算,Raster值為SRCAND,貼到目的地DC中。
<2>將前景圖與背景圖做"OR"運(yùn)算,Raster值為SRCPAINT,貼到目的地DC中。
為什么經(jīng)過(guò)上面兩個(gè)操作就能產(chǎn)生透明的效果呢?看下圖就理解了:
下面具體說(shuō)明上面兩個(gè)步驟所產(chǎn)生的圖點(diǎn)色彩的變化。
1.屏蔽圖與背景圖做"AND"運(yùn)算
<1>屏蔽圖中的黑色部分與背景圖做"AND"運(yùn)算:
我們?cè)趺礃邮褂脛t會(huì)圖來(lái)處理透明呢?其實(shí)就是Raster運(yùn)算。
將屏蔽圖和背景圖做“AND”運(yùn)算,貼到目的DC; 再將前景圖和背景圖做“OR”運(yùn)算,貼到目的DC;
<2>屏蔽圖中的白色部分與背景圖做"AND"運(yùn)算:
2.前景圖與背景圖做"OR"運(yùn)算
<1>前景圖中的彩色部分與圖第一步得到的“黑色恐龍”圖做"OR"運(yùn)算:
<2>前景圖中的黑色部分與第一步得到的“黑色恐龍”圖做"OR"運(yùn)算:
經(jīng)過(guò)這一運(yùn)算后所顯示的畫(huà)面就是所需的透明圖了,如下圖所示:
現(xiàn)在開(kāi)始編寫(xiě)程序:
在VS2008中新建Win32程序,使用VC默認(rèn)的框架。
#include "stdafx.h"
//全局變量聲明
HINSTANCE hInst;
HBITMAP bg,dra; //聲明兩個(gè)位圖對(duì)象,分別存儲(chǔ)背景圖與前景恐龍圖
HDC mdc; //聲明一個(gè)內(nèi)存DC"mdc",用來(lái)暫存位圖
//全局函數(shù)聲明
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);
////****Winmain函數(shù),程序入口點(diǎn)函數(shù)**************************************
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
//消息循環(huán)
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//****設(shè)計(jì)一個(gè)窗口類(lèi),類(lèi)似填空題,使用窗口結(jié)構(gòu)體*************************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "canvas";
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
//****初始化函數(shù)*************************************
// 1.建立與窗口DC兼容的內(nèi)存DC
// 2.從文件加載背景圖與恐龍圖
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
HDC hdc;
hInst = hInstance;
hWnd = CreateWindow("canvas", "繪圖窗口" , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
MoveWindow(hWnd,10,10,600,450,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hdc = GetDC(hWnd); //獲得窗口DC
mdc = CreateCompatibleDC(hdc); //創(chuàng)建與窗口兼容的內(nèi)存DC(mdc)
bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,600,450,LR_LOADFROMFILE);
//J加載背景圖到bg中
dra = (HBITMAP)LoadImage(NULL,"dra.bmp",IMAGE_BITMAP,170,99,LR_LOADFROMFILE);
//加載恐龍圖到dra中
MyPaint(hdc);
ReleaseDC(hWnd,hdc);
return TRUE;
}
//****自定義繪圖函數(shù)*********************************
//透明貼圖
void MyPaint(HDC hdc)
{
SelectObject(mdc,bg);
BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY); //先將背景圖貼到顯示窗口中
SelectObject(mdc,dra); //選用恐龍圖到"mdc"中
BitBlt(hdc,280,320,85,99,mdc,85,0,SRCAND);//進(jìn)行制作貼圖的第一步驟,即將屏蔽圖與背景圖做"AND"運(yùn)算,屏蔽圖在整張恐龍圖中,最左上角起始位置點(diǎn)得坐標(biāo)為(85,0),BitBlt()函數(shù)中最后一個(gè)Raster參數(shù)值設(shè)置為SRCAND。
BitBlt(hdc,280,320,85,99,mdc,0,0,SRCPAINT);//進(jìn)行制作透明貼圖的第二步驟,即將前景圖與背景圖做"OR"運(yùn)算,前景圖在整張恐龍圖中,最左上角起始位置的坐標(biāo)為(0,0),BitBlt()函數(shù)最后一個(gè)參數(shù)值設(shè)置為SRCPAINT。
}
//****消息處理函數(shù)**********************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT: //窗口重繪消息
hdc = BeginPaint(hWnd, &ps);
MyPaint(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY: //窗口結(jié)束消息
DeleteDC(mdc);
DeleteObject(bg);
DeleteObject(dra);
PostQuitMessage(0);
break;
default: //其他消息
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
熱門(mén)資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢(xún)報(bào)名。
2. 手機(jī)游戲如何開(kāi)發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說(shuō)明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動(dòng)化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白。快來(lái)試試!
4. Steam值得入手的武俠游戲盤(pán)點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個(gè)抉定都將觸發(fā)更多愛(ài)恨糾葛的精彩奇遇。《天命奇御》具有多線(xiàn)劇情多結(jié)局,不限主線(xiàn)發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動(dòng)
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動(dòng)漫建模全過(guò)程,不是一般人能學(xué)的會(huì)的,會(huì)的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫(huà)的形式。像往常一樣,我從Sphere創(chuàng)建它...
7. 3D動(dòng)畫(huà)軟件你知道幾個(gè)?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動(dòng)畫(huà)軟件或動(dòng)畫(huà)工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動(dòng)畫(huà)的軟件程序。但是,在3D動(dòng)畫(huà)軟件中還包含了其他類(lèi)型的...
8. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
9. 開(kāi)發(fā)三昧游戲叫什么(三昧動(dòng)漫)
?三昧動(dòng)漫對(duì)于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會(huì)推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
10. 如何自己開(kāi)發(fā)一款游戲(游戲開(kāi)發(fā)入門(mén)必看:五大獨(dú)立游戲開(kāi)發(fā)技巧)
?游戲開(kāi)發(fā)入門(mén)必看:五大獨(dú)立游戲開(kāi)發(fā)技巧無(wú)論您是剛剛起步開(kāi)發(fā)自己的第一款游戲,還是已經(jīng)制作了幾款游戲,本篇文章中的5大獨(dú)立游戲開(kāi)發(fā)技巧都可以幫助您更好地設(shè)計(jì)下一款游戲。無(wú)論你對(duì)游戲有著什么樣的概念,都
最新文章
同學(xué)您好!