【Visual C+】ゲームプログラミング学習ノートの一つ:5角特殊効果の透明性と半透明処理
8517 ワード
このシリーズの文章は@二品の夢から家を恋しがる張程です. 転載は出所を明記してください.
この記事のリンク:http://blog.csdn.net/terence1212/article/details/44163799
著者:ZeeCoder マイクロブログリンク:http://weibo.com/zc463717263
私のメールアドレス:[email protected] 皆さん、メールで私とプログラミングの心得を交流してください.
you are what you read!みんなと励ましましょう
----------------------------------------------------------------------------------------------------------------------------------------------------
本科の専门はコンピュータではないですが、コンピューターに対して大きな兴味を持っています.C言语とVC+、MFCプログラミングもずっと独学しています.だから、VC++ゲームのプログラミングの上手さに接触するのはそんなに难しくないです.
OKです.本題に入ります.
1.透明効果
Pの話は多くなくて、直接コードを説明します.
透明効果は万能なスタンプ関数BitBltを使う必要があります.
はい、直接コードをつけます.(本ノートは全部VSL 2010プラットフォームでプログラミングします)
1、まずグローバル変数を定義する
この記事のリンク:http://blog.csdn.net/terence1212/article/details/44163799
著者:ZeeCoder マイクロブログリンク:http://weibo.com/zc463717263
私のメールアドレス:[email protected] 皆さん、メールで私とプログラミングの心得を交流してください.
you are what you read!みんなと励ましましょう
----------------------------------------------------------------------------------------------------------------------------------------------------
本科の専门はコンピュータではないですが、コンピューターに対して大きな兴味を持っています.C言语とVC+、MFCプログラミングもずっと独学しています.だから、VC++ゲームのプログラミングの上手さに接触するのはそんなに难しくないです.
OKです.本題に入ります.
1.透明効果
Pの話は多くなくて、直接コードを説明します.
透明効果は万能なスタンプ関数BitBltを使う必要があります.
BOOL BitBlt(
HDC hdc; // DC
int x; // DC x
int y; // DC y
int nWidth; // DC
int nHeight;// DC
HDC mdc; // DC
int xSrc; // DC x
int ySrc; // DC y
DWORD dwRop;//
);
dwRopスタンプ方式は以下のN種類があります.BLACKNESS
DSTINVERT
MERGECOPY
MERGEPAINT
NOTSRCCOPY
NOTSRCERASE ,
PATCOPY
PATINVERT
PATPAINT
SRCAND
SRCCOPY
SRCERASE
SRCINVERT
SRCPAINT
WHITENESS
透明効果は、SRCANDとSRCPAINTの2つのスタンプ方式を使用する必要がある.はい、直接コードをつけます.(本ノートは全部VSL 2010プラットフォームでプログラミングします)
1、まずグローバル変数を定義する
<pre name="code" class="cpp">//
HINSTANCE hInst;
HBITMAP bg , character; //
HDC mdc; // DC
void MyPaint(HDC hdc); //
2、初始化函数
3、カスタムスタンプ関数//**** ************************************* // 1. DC DC // 2. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; HDC hdc; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } MoveWindow(hWnd , 10 ,10 , 650 , 600 ,true); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); hdc = GetDC(hWnd);// DC mdc = CreateCompatibleDC(hdc);//// DC(mdc) bg = (HBITMAP)LoadImage(NULL , _T("res.bmp") , IMAGE_BITMAP , 640 , 360 ,LR_LOADFROMFILE);// bg character = (HBITMAP)LoadImage(NULL , _T("dra.bmp"), IMAGE_BITMAP , 170 , 99 , LR_LOADFROMFILE);// character MyPaint(hdc); return TRUE; }
4.効果図://**** ********************************* // void MyPaint(HDC hdc) { SelectObject(mdc , bg); BitBlt(hdc , 0 , 0 , 650 ,360 , mdc , 0 ,0 ,SRCCOPY );// SelectObject(mdc , character);// character "mdc" BitBlt(hdc , 200 , 200 , 85 , 128 , mdc , 85 , 0 , SRCAND);// , "AND" , , (85,0),BitBlt() Raster SRCAND。 BitBlt(hdc , 200 ,200 ,85 ,128 , mdc , 0 ,0 , SRCPAINT);// , "OR" , , (0,0),BitBlt() SRCPAINT。 }
2.半透明効果
半透明効果は主に以下のステップに分けられます.
(1)ビットマップ構造を取得するこの関数はここでビットマップの情報を取得するためにビットマップ構造のアドレスを入力します.windows Appiで定義されているビットマップ構造(BITMAP)は以下の通りです.int GetObject( HGDIOBJ hgdiobj, // GDI int cbBuffer, // LPVOID lpvObject // );
ビットマップ情報を取得するには、プログラムコードは以下の通りです.typedef struct tagBITMAP { LONG bmType; // 0 LONG bmWidth;// LONG bmHeight;// LONG bmWidthBytes;// Bit WORD bmPlanes;// WORD bmBitsPixel;// LPVOID bmBits;// } BITMAP;
(2)暫定配列の作成GetObject( bitmap , sizeof(BITMAP) , &bm);
動的ポインタで一時的な配列を作成して、ビットマップのすべてのピクセルの色値を記憶します.
プログラムコードは以下の通りです.(3)ビットマップ値を取得するunsigned char *px1 = new unsigned char [bm.bmHeight * bm.bmWidthBytes];
ビットマップのすべての色の値を取得するには、次の関数が必要です.(4)合成画素色値GetBitmapBits( HBITMAP hbit, // LONG cb, // bit LPVOID lpvBits // );
半透明領域の各ピクセルの色を不透明度で設定します.
(5)ビットマップの色をリセットする
前のステップで得られた一時保存配列の半透明色の値に基づいて、ビットマップの色の値をリセットします.
ここではwindowsAppleが提供する関数を使います.OKです.全部の手順をここに紹介します.具体的にどうやって実現しますか?SetBitmapBits( HBITMAP hbm, // DWORD cb, // CONST VOID *pvBits // );
1、グローバル変数設定2、初期化関数HINSTANCE hInst; // current instance HBITMAP bg , dra ; HDC mdc; // const int xstart = 50 ; const int ystart = 20 ;
3、カスタム図形描画関数BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; HDC hdc; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } MoveWindow(hWnd , 10 ,10 , 650 , 600 ,true); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); hdc = GetDC(hWnd); mdc = CreateCompatibleDC(hdc); BITMAP bm1 , bm2 ; unsigned char *px1 , *px2 ; // bg = (HBITMAP)LoadImage(NULL , _T("res.bmp") , IMAGE_BITMAP , 640 , 360 ,LR_LOADFROMFILE); GetObject(bg , sizeof(BITMAP) , &bm1); if (bm1.bmBitsPixel != 32 && bm1.bmBitsPixel != 24) { MessageBox(NULL, _T(" 32bit 24bit " ), _T(" ") , 0); return FALSE; } px1 = new unsigned char [bm1.bmHeight * bm1.bmWidthBytes]; GetBitmapBits(bg , bm1.bmHeight * bm1.bmWidthBytes , px1); // dra = (HBITMAP)LoadImage(NULL , _T("14.bmp"), IMAGE_BITMAP , 120 , 128 , LR_LOADFROMFILE); GetObject(dra , sizeof(BITMAP) , &bm2); px2 = new unsigned char [bm2.bmHeight * bm2.bmWidthBytes]; GetBitmapBits(dra , bm2.bmHeight * bm2.bmWidthBytes , px2); int xend ,yend ; int x ,y , i ; int rgb_b; int PxBytes = bm1.bmBitsPixel / 8 ; xend = xstart + 120 ; yend = ystart + 128 ; // for ( y = ystart ; y < yend ; y++) { for (x = xstart ; x < xend ; x++) { rgb_b = y * bm1.bmWidthBytes + x * PxBytes ; px1[rgb_b] = px1[rgb_b] * 0.7; px1[rgb_b + 1] = px1[rgb_b + 1] * 0.7; px1[rgb_b + 2] = px1[rgb_b + 2] * 0.7; } } // for ( y = 0 ; y < (bm2.bmHeight) ; y++) { for (x = 0 ; x < bm2.bmWidth ; x++) { rgb_b = y * bm2.bmWidthBytes + x * PxBytes ; i = (ystart + y )* bm1.bmWidthBytes + (xstart + x )*PxBytes; px2[rgb_b] = px2[rgb_b] * 0.3 + px1[i]; px2[rgb_b + 1] = px2[rgb_b + 1] * 0.3 + px1[i+1]; px2[rgb_b + 2] = px2[rgb_b + 2] * 0.3 + px1[i+2]; } } SetBitmapBits(dra , bm2.bmHeight * bm2.bmWidthBytes , px2); MyPaint(hdc); ReleaseDC(hWnd ,hdc); delete [] px1; delete [] px2; return TRUE; }
プログラム運転効果図void MyPaint(HDC hdc) { SelectObject(mdc , bg); BitBlt(hdc , 0 , 0 , 650 ,360 , mdc , 0 ,0 ,SRCCOPY ); SelectObject(mdc , dra); BitBlt(hdc , xstart , ystart , 120 , 128 , mdc , 0 , 0 , SRCCOPY); }
ここまで書いてもこのブログはもう完成しました.初めて書きます.たくさんのところでうまくできないので、皆さんが通っている観光客の皆さんに多くのアドバイスをお願いします.
end!