摘要:许多游戏软件的开发中,实现高速平滑的动画需要许多比较深的技术,如:OpenGL、DirectX,并且可能还要开发人员有深厚的数学功底。但是,我们在开发一些小游戏,或为应用
程序的界面实现一些动画效果,就可能不用以上这些技术了,我们更多的是用Windows API提供或MFC封装后的GDI绘图函数来实现。为此我们可不可以用GDI来实现高速平滑的动画呢?
答案是肯定的。本文教您如何用GDI函数来开发平滑无闪的动画,并以一个应用实例来介绍这些用法。
关键词:GDI,MFC,Bitmap,内存设备环境
一、动画原理。
大家都知道播放电影的原理:在规定时间(一般为1秒)播放24幅连续的画面,由于人的视觉暂留,所以人们在观看电影时,看到的就不是一幅一幅的画面,而是丰富精彩的场景。于是,我们也模仿电影播放原理来用在编程中实现平滑无闪的动画。其实,这个原理已经在当今动画技术中实现,但我们讨论的是在VC++中用GDI函数实现同样效果的技术。
我已采用此技术开发了一款纸牌游戏:“扑克麻将”。读者可到Http://www.csdn.net
程序员大本营上
下载,软件代号:9175。“扑克麻将”中使用的动画技术全部系文本介绍,从游戏中读者可看到:不论是发牌,出牌,选牌,吃牌等各种操作,游戏画面看不到一丝闪动,速动也极快。
二、实现方法。
其实本技术也很简单,其关键就是在内存中创建一个与显示动画的窗口区域一样大的位图,先用GDI函数绘制位图,然后在适当的时候从内存中显示出来。因为位图已经绘制好,不象平时编程一样边绘制边显示,所以,显示一帧图形时,减速少了闪烁,从而实现平滑动画;并且,图形是从内存中直接显示到当前窗体,所以速度也很快,从而实现高速动画。下面我们将介绍实现这些技术的步骤:
1、启动 VC++,创建一个MFC支持的单文档应用
程序。
2、选择菜单项Inert\New Class创建一个从CBitmap类继承的类,取名为:CMemBitmap。我们创建了一个位图类来模仿电影中的一帧画面,作为将要显示在窗口区域(电影屏幕)的图像。今后,所有的绘图操作都针对这个位图类进行,而这些绘图操作,我们可以用成员函数来实现,比如:显示一个位图、一段文字及GDI函数中所有的绘图函数。
3、创建好位图类后,为了同窗体联系起来,用窗体的CDC内存设备环境指针创建该位图与窗体的客户区一样大。为此在位图类头文件MemBitmap.h可声明一个CWnd指针成员变量:m_PWnd,用以指向窗体,如下代码所示:
private:
CWnd* pWnd;
再声明一个成员函数来创建位图,其声明代码如下所示:
public:
void Init(CWnd* pwnd);
在MemBitmap.cpp中实现代码如下:
//初始化位图类
void CMemBitmap::init(CWnd *pwnd)
{
RECT rt; //保存窗体客户区域的大小的矩形类型变量
pWnd = pwnd; //获取窗体指针
pwnd->GetClientRect(&rt); //得到窗体客户区域的大小
//利用窗体类的CDC指针在内存中创建位图
CreateCompatibleBitmap(pwnd->GetDC(), rt.right;, rt.bottom);
}
CreateCompa