【Visual C+】ゲームプログラミング学習ノートの一つ:5角特殊効果の透明性と半透明処理


このシリーズの文章は@二品の夢から家を恋しがる張程です. 転載は出所を明記してください.
この記事のリンク: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、初始化函数 
  
 

//****     *************************************  
// 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;
}
3、カスタムスタンプ関数
//****       *********************************  
//      
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。
}
4.効果図:
【Visual C++】游戏编程学习笔记之一:五毛钱特效之透明和半透明处理_第1张图片
2.半透明効果
半透明効果は主に以下のステップに分けられます.
(1)ビットマップ構造を取得する
int GetObject(
	HGDIOBJ hgdiobj,	//  GDI    
	int cbBuffer,		//    
	LPVOID lpvObject	//    
);
この関数はここでビットマップの情報を取得するためにビットマップ構造のアドレスを入力します.windows Appiで定義されているビットマップ構造(BITMAP)は以下の通りです.
typedef struct tagBITMAP
{
	LONG        bmType; //        0
	LONG        bmWidth;//    
	LONG        bmHeight;//    
	LONG        bmWidthBytes;//       Bit 
	WORD        bmPlanes;//     
	WORD        bmBitsPixel;//     
	LPVOID      bmBits;//      
} BITMAP;
ビットマップ情報を取得するには、プログラムコードは以下の通りです.
GetObject( bitmap , sizeof(BITMAP) , &bm);
(2)暫定配列の作成
動的ポインタで一時的な配列を作成して、ビットマップのすべてのピクセルの色値を記憶します.
プログラムコードは以下の通りです.
 unsigned char *px1 = new unsigned char [bm.bmHeight * bm.bmWidthBytes];
(3)ビットマップ値を取得する
ビットマップのすべての色の値を取得するには、次の関数が必要です.
GetBitmapBits(
	HBITMAP hbit,	//      
	LONG cb,	//    bit 
	LPVOID lpvBits	//        
	);
(4)合成画素色値
半透明領域の各ピクセルの色を不透明度で設定します.
(5)ビットマップの色をリセットする
前のステップで得られた一時保存配列の半透明色の値に基づいて、ビットマップの色の値をリセットします.
ここではwindowsAppleが提供する関数を使います.
SetBitmapBits(
		HBITMAP hbm,		//  
		DWORD cb,		//       
		CONST VOID *pvBits	//    
	);
OKです.全部の手順をここに紹介します.具体的にどうやって実現しますか?
1、グローバル変数設定
HINSTANCE hInst;								// current instance
HBITMAP bg , dra ;
HDC mdc;
//    
const int xstart = 50 ;
const int ystart = 20 ;
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);
   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;
}
3、カスタム図形描画関数
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);
}
プログラム運転効果図
【Visual C++】游戏编程学习笔记之一:五毛钱特效之透明和半透明处理_第2张图片
ここまで書いてもこのブログはもう完成しました.初めて書きます.たくさんのところでうまくできないので、皆さんが通っている観光客の皆さんに多くのアドバイスをお願いします.
end!