VC++游戏编程----游戏画面特效制作1

本文介绍如何在VC++游戏中制作透明效果,通过BitBlt的Raster运算实现,适用于原图背景为黑色的情况。步骤包括使用'AND'运算处理屏蔽图和背景图,再用'OR'运算处理前景图,以达到透明贴图的目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

透明效果


有时候,我们需要在画面上显示一张角色的图像,而这张图片是有自己的背景的,要是直接贴到了游戏的画面中,就会出项覆盖游戏画面。显示出的效果特别不好,这里我们可以用到透明效果来处理。

其中,原理就是用BitBlt() 的Raster值运算去掉原图片的背影。但是只适用于原图背景为黑色,才会看到效果。


如图,左边部分为前景图,右边部分为屏蔽图

前景图的背景必须为黑色,屏蔽图的背景为白色



以下为显示的背景图



我们怎么样使用则会图来处理透明呢?其实就是Raster运算。

将屏蔽图和背景图做“AND”运算,贴到目的DC; 再将前景图和背景图做“OR”运算,贴到目的DC;


现在开始编写程序:

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

首先定义全局变量:

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;

编译运行程序:



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值