Welcome

首页 / 软件开发 / VC.NET / MFC游戏开发笔记三 游戏贴图与透明特效的实现

MFC游戏开发笔记三 游戏贴图与透明特效的实现2014-11-03对于一个游戏来说,画面的华丽程度在很大程度上决定了它的火热程度,记得以前初中时候我在网上找游戏玩时,首先看的就是画面是不是好看,技能是不是酷炫,呵呵。而精美游戏的实现就是通过贴图来实现啦,因此要想做出一个好游戏,光有Coder是不够的,必须要有给力的美工,当然还要有好的策划,好的数值设定什么的。不过大家自己学做游戏也不用担心素材的问题了,网上有很多,大家如果不是做商业游戏,用别人的是没什么问题的。

在这一节笔记里,我会讲解使用CBitmap和CImage两种贴图方式,并且会讲解一下透明贴图的实现。我先解释一下,所谓透明贴图,是指贴图只贴前景图,背景和大背景融合,比如大家贴了一张地图后,要在上面再贴一个小人,如果不采用透明贴图的话,那么小人图的背景也会被贴上。

一、一些基本的知识

创建一个窗口之后,显示的屏幕上便划分出三个区域,即屏幕区(Screen),窗口区(Window)与内部窗口区(Client)DeviceContext(设备内容)一般简称为DC,简单来说,DC就是程序可以进行绘图的地方。

若要取得窗口的DC,可以调用下面这个函数:

HDC GetDC(); //取得DC

若使用GetDC()函数取得窗口DC后,必须使用ReleaseDC()函数将DC释放。

Int ReleaseDC(HDC 要释放的DC名称);//释放DC,若运行成功,返回整数1,若失败返回0

我简单解释一下需要释放DC的原因:

每个进程的GDI句柄数是由上限的(在注册表中配置,一般值为10000)。如果不关闭,就会有句柄泄露(这些句柄会在进程结束时被关闭)。大家在编程要养成良好的习惯,就如同new的空间用完一定要delete一样,虽然可能表面上不会影响你的程序的运行,但是埋下了隐患。

在我们建立的MFC单文档程序中,大家在调整好窗口后,剩下的文件大家就只需要关注CChildView.h和CChildView.cpp这两个文件了,这个视图类会展示出程序的画面。

大家需要定义变量或者属性的时候可以在ChildView.h里面进行,就作为这个类的成员变量就好了。这些变量如果需要初始化,请放在ChildView.cpp中的BOOL CChildView::PreCreateWindow(CREATESTRUCT&cs) 函数里进行。在后面的教程中,如果未特别说明,就是按照这个规则来的。

在ChildView.h中有个函数void CChildView::OnPaint() ,这个就是绘图函数啦,我们需要绘制在屏幕上的所有东西就丢给它就好了。当产生WM_PAINT绘图消息时(比如别的窗口从我们的游戏窗口经过了等,就需要重新绘制一遍画面,windows就会产生一个WM_PAINT消息加入到程序的消息队列中去),这个OnPaint()函数就会被调用一遍。但是大家知道,游戏为了保持一个高的帧数(FPS),是需要不断的重绘画面的,因此我们就需要使得这个OnPaint()函数不断的被执行,这个可以采用定时器来做到,在后面我会进行讲解。

因此,在程序中绘图部分,我们首先要知道的是画图的地方,即获得DC,通过GetDC这个API可以实现,接着需要做的就是获得画图地方的大小,就是内部窗口区(Client),这个微软为我们提供了GetClientRect这个API,然后我们就可以画图啦,当然在最后需要释放DC哦。

讲了这么多,我们开始动手写代码吧。

大家在CChildView.h中加入变量定义

CRect m_client;

我解释一下,CRect 是一个矩形类,它由四个成员变量:top,bottom,left,right,可以用来记录一个矩形的左上角和右下角的坐标,一般我们都是用它来保存一个矩形物体的大小的。

接下来,在CChildView.cpp中的void CChildView::OnPaint()函数中写入下面的代码就好了

CDC *cDC=this->GetDC(); //获得当前窗口的DC GetClientRect(&m_client); //获得窗口的尺寸//加入我们要绘制的代码。。。。。。ReleaseDC(cDC); //释放DC
到现在绘图的准备工作都做完了,接下来我们就开始绘图了。

二、使用CBitmap类进行绘图

大家看名字就可以知道,这个类是用来绘制位图的,即以“.bmp”为后缀的图片。一般游戏之中,需要使用的图片比较多,都会将图片先存为文件,然后从文件中读取,而从文件中读取图片的步骤有以下几步:

1.建立一个与窗口DC兼容的内存DC

我们加载的图片是需要先放在一个内存中的DC里,然后把需要显示的图片从内存DC中绘到窗口DC中即可,我们可以认为内存DC就是一个个备胎,每个DC都是一个屌丝男士,窗口DC就是女神啦,女神需要谁去帮忙做事的时候,那个屌丝男士就和女神在一起了,当然是暂时的,呵呵。

我们首先定义一个内存DC对象;

CDC m_bgcDC;

然后就开始创建一个DC了;

m_bgcDC.CreateCompatibleDC(NULL);

看名字我们就可以知道它的意思了,创建一个兼容的DC。它的参数是CDC*类型的,即一个DC的指针,函数会创建和参数DC兼容的DC。如果我们将参数填为NULL,函数会自动创建和当前程序DC兼容的内存DC,所以我们可以直接设置为NULL。

更多精彩内容:http://www.bianceng.cn/Programming/VC_NET/