VC++遊戲編程----遊戲畫面特效製做1

透明效果框架


有時候,咱們須要在畫面上顯示一張角色的圖像,而這張圖片是有本身的背景的,要是直接貼到了遊戲的畫面中,就會出項覆蓋遊戲畫面。顯示出的效果特別很差,這裏咱們能夠用到透明效果來處理。函數

其中,原理就是用BitBlt() 的Raster值運算去掉原圖片的背影。可是隻適用於原圖背景爲黑色,纔會看到效果。3d


如圖,左邊部分爲前景圖,右邊部分爲屏蔽圖code

前景圖的背景必須爲黑色,屏蔽圖的背景爲白色blog



如下爲顯示的背景圖遊戲



咱們怎麼樣使用則會圖來處理透明呢?其實就是Raster運算。圖片

將屏蔽圖和背景圖作「AND」運算,貼到目的DC; 再將前景圖和背景圖作「OR」運算,貼到目的DC;it


如今開始編寫程序:編譯

在VS2008中新建Win32程序,使用VC默認的框架。ast

首先定義全局變量:

HBITMAP bg, dra;								//用來存儲背景與前景圖
HDC hdc;										//用來暫時存儲位圖的DC

而後在InitInstance()函數中,添加代碼,繪製圖形。

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   HDC hdc;

   hInst = hInstance; // 將實例句柄存儲在全局變量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   MoveWindow(hWnd, 50, 50, 1024, 768, true);
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   //創建窗口DC兼容DC
   hdc = GetDC(hWnd);
   mdc = CreateCompatibleDC(hdc);
   //載入位圖
   bg = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 1024, 768, LR_LOADFROMFILE);
   dra = (HBITMAP)LoadImage(NULL, L"dra.bmp", IMAGE_BITMAP, 170, 99, LR_LOADFROMFILE);

   Paint(hdc);		//繪製透明位圖
   ReleaseDC(hWnd, hdc);	//釋放DC
   return TRUE;
}
其中paint()中代碼:

void Paint(HDC hdc)
{
	//將背景圖貼入窗口
	SelectObject(mdc, bg);
	BitBlt(hdc, 0, 0, 1024, 768, mdc, 0, 0, SRCCOPY);
	//
	SelectObject(mdc, dra);
	BitBlt(hdc, 580, 560, 85, 99, mdc, 85, 0, SRCAND);
	BitBlt(hdc, 580, 560, 85, 99, mdc, 0 ,0 ,SRCPAINT);
}

最後在WndProc函數中WM_PAINT消息中添加劇繪

case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 在此添加任意繪圖代碼...
		Paint(hdc);
		EndPaint(hWnd, &ps);
		break;

編譯運行程序: