设为首页 加入收藏

TOP

Windows下的高级动画技术浅析(二)
2012-11-04 15:19:09 来源: 作者: 【 】 浏览:401
Tags:Windows 高级 动画 技术 浅析
  2.3异或方式

  用异或方式实现动画的例子比较多,如绘图软件中的"橡皮筋技术"便是利用这种方式实现的。

  "异或"是一种逻辑组合的方式(在Windows编程(www.cppentry.com)中,绘图颜色的各种逻辑组合操作被称为"光栅操作")。在这种绘图模式下进行绘图,源颜色与屏幕底色将会进行异或逻辑组合,实际的显示颜色将会是逻辑组合后的颜色。而且,用相同的颜色在同一位置绘图两次,其效果和没有绘图时完全相同。

  下面是利用异或方式进行绘图的程序结构框架。

// 设置当前绘图方式为异或方式,hDC为用来绘图的设备对象HDC,
::SetROP2(hDC, R2_XORPEN);
while( 条件 )
{
 在(x, y)位置用颜色color绘图。
 延时。
 重新在(x, y)位置用颜色color绘图,这时原来绘制的图形将会被消除。
 更新(x, y)坐标或color颜色,为在下一个循环中绘图做准备。
}

  利用异或方式进行绘图通常能够得到很好的动画效果。

  2.4像素操作

  像素操作一般和其他动画实现方法(如底色覆盖)相结合使用。

  首先用GetPixel()函数得到初始屏幕某位置像素的颜色,并保存起来;然后在该位置进行绘图;经过延时后,利用SetPixel()函数用事先保存好的颜色在原位置覆盖掉已经绘制的图形,并更新位置参数;接着进行下一个循环。

  2.5多缓冲技术

  多缓冲技术是将图形绘制在不同的帧中,通过将屏幕在这些不同的帧之间进行切换,来达到动画效果。具体的帧数目可以根据实际动画的需要自行确定。

  在Nord-Tec SoftWare开发的Nord-Tec Snow Flakes屏幕保护程序(可以在www. nord-tec.com下载)中,逼真的雪花动画便是利用这种技术实现的。仿照该程序,我也作了一个类似的屏幕保护程序。下面通过介绍我编制的程序的结构框架,来具体地介绍多缓冲技术的实现方法。

  程序采用3帧来实现动画,不同的帧通过不同的设备对象句柄来引用,实现各自的功能。下面是程序的结构框架:

HDC hMemoryDC; // 内存设备对象,用来绘图 -- 绘图帧
HDC hScreenDC; // 当前显示屏幕的设备对象,用来显示图形 -- 显示帧
HDC hMemoryDCBk; // 内存设备对象,用来保存图形背景 -- 背景帧
int screenX, screenY // 当前整个屏幕的分辨率参数
void DrawPictureOnMemoryDC ( HDC hDC ); // 实际绘图函数
void JudgeAndChangeMemoryDCBk( HDC hDC ); // 判断函数

screenX = ::GetSystemMetrics(SM_CXSCREEN); // 获得屏幕的分辨率
screenY = ::GetSystemMetrics(SM_CYSCREEN);
hScreenDC = ::GetDC(hWnd); // 获得当前窗口的设备对象句柄,即创建显示帧

// 创建一个与当前屏幕相同大小的位图对象
HBITMAP hBitMap = ::CreateCompatibleBitmap(hScreenDC,screenX,screenY);
// 创建绘图帧
hMemoryDC = ::CreateCompatibleDC(hScreenDC);
// 将位图对象选中到绘图帧中,因为绘图要操作整个屏幕
::SelectObject(hMemoryDC,hBitMap);

// 创建另一个位图对象
hBitMap = ::CreateCompatibleBitmap(hScreenDC,screenX,screenY);
// 创建背景帧
hMemoryDCBk = ::CreateCompatibleDC(hScreenDC);
// 将位图对象选中到背景帧中
::SelectObject(hMemoryDCBk,hBitMap);

// 将当前屏幕的状态复制到背景帧中
::BitBlt(hMemoryDCBk,0,0,screenX,screenY,hScreenDC,0,0,SRCCOPY);

while( 条件 )
{
 // 将背景帧的图形复制到绘图帧中
 ::BitBlt(hMemoryDC,0,0,screenX,screenY,hMemoryDCBk,0,0,SRCCOPY);
 // 在绘图帧中绘制图形
 DrawPictureOnMemoryDC ( hMemoryDC );
 // 将绘图帧中的图形复制到当前显示屏幕上
 ::BitBlt(hScreenDC,0,0,screenX,screenY,hMemoryDC,0,0,SRCCOPY);
 // 判断并决定是否更改背景帧
 JudgeAndChangeMemoryDCBk ( hMemoryDCBk );
 ::Sleep(100) // 延时
}

::ReleaseDC(hWnd,hMemoryDC); // 释放内存
::ReleaseDC(hWnd,hScreenDC);
::ReleaseDC(hWnd,hMemoryDCBk);

  通过实际的程序代码,可以很容易地理解利用多缓冲技术实现动画的方法。

  2.6其它方法

  除了上面提到的一些的基本方法之外,还有很多技术应用于Windows下的动画,如颜色锁结、DirectX技术,以及用于3D效果的Z排序与视差等等。这些技术涉及到了很深的相关专业知识,此处不便于将他们一一加以描述。但无论怎样,各种实现方法的基本思想还是一致的,即利用连续的帧来对图形进行显示。

  3.结束语

  Windows下的动画实现涉及到了许许多多的相关技术,这些技术的难度各异,同时也涉及到许多相关的领域。在程序设计中,在考虑采用何种方法实现动画的同时,也要了解一些相关领域的知识,如美学、数学等等,只有这样,才能使制作出的动画更加逼真,更加吸引人。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Visual C++编程封装ADO类 下一篇应用软件联机帮助文件的制作

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: