[宝典]vc 游戏编程----游戏画面特效制作1
有时候,我们需要在画面上显示一张角色的图像,而这张图片是有自己的背景的,要是直接贴到了游戏的画面中,就会出项覆盖游戏画面。显示出的效果特别不好,这里我们可以用到透明效果来处理。
其中,原理就是用BitBlt() 的Raster值运算去掉原图片的背影。但是只适用于原图背景为黑色,才会看到效果。
如图,左边部分为前景图,右边部分为屏蔽图
前景图的背景必须为黑色,屏蔽图的背景为白色
以下为显示的背景图
我们怎么样使用则会图来处理透明呢,其实就是Raster运算。 将屏蔽图和背景图做“AND”运算,贴到目的DC; 再将前景图和背景图做“OR”运算,贴到目的DC;
现在开始编写程序:
在VS2008中新建Win32程序,使用VC默认的框架。 首先定义全局变量:
[cpp] view plaincopyprint?
1. HBITMAP bg, dra; //用来存储背景与前景图
2. HDC hdc; //用来暂时存储位图的DC
然后在InitInstance()函数中,添加代码,绘制图形。 [cpp] view plaincopyprint?
1. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
2. {
3. HWND hWnd;
4. HDC hdc;
5.
6. hInst = hInstance; // 将实例句柄存储在全局变量中
7.
8. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWIN
DOW,
9. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance,
NULL);
10.
11. if (!hWnd)
12. {
13. return FALSE;
14. }
15.
16. MoveWindow(hWnd, 50, 50, 1024, 768, true);
17. ShowWindow(hWnd, nCmdShow);
18. UpdateWindow(hWnd);
19. //建立窗口DC兼容DC
20. hdc = GetDC(hWnd);
21. mdc = CreateCompatibleDC(hdc);
22. //载入位图
23. bg = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 1024, 7
68, LR_LOADFROMFILE);
24. dra = (HBITMAP)LoadImage(NULL, L"dra.bmp", IMAGE_BITMAP, 170, 9
9, LR_LOADFROMFILE);
25.
26. Paint(hdc); //绘制透明位图
27. ReleaseDC(hWnd, hdc); //释放DC
28. return TRUE;
29. }
其中paint()
中代码:
[cpp] view plaincopyprint?
1. void Paint(HDC hdc)
2. {
3. //将背景图贴入窗口
4. SelectObject(mdc, bg);
5. BitBlt(hdc, 0, 0, 1024, 768, mdc, 0, 0, SRCCOPY);
6. //
7. SelectObject(mdc, dra);
8. BitBlt(hdc, 580, 560, 85, 99, mdc, 85, 0, SRCAND);
9. BitBlt(hdc, 580, 560, 85, 99, mdc, 0 ,0 ,SRCPAINT);
10. }
最后在WndProc函数中WM_PAINT消息中添加重绘 [cpp] view plaincopyprint?
1. case WM_PAINT:
2. hdc = BeginPaint(hWnd, &ps);
3. // TODO: 在此添加任意绘图代码...
4. Paint(hdc);
5. EndPaint(hWnd, &ps);
6. break;
编译运行程序: