分享
 
 
 

动画程序编写——DirectDraw之旅(1)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

DirectDraw――也许大多数人闻所未闻,但当提到 DirectX 恐怕每一个 游戏爱好者都再熟悉不过了,但是只知道那是一个很多游戏都要求的必须安装的程序,再多就无从所知了,那么它到底能为我们的游戏干什么呢,其实它又叫 Game SDK,它最大的特点是直接对硬件的抽象层(HAL)进行操作,利用 此特点可制作出高性能的Windows游戏。

http://www. microsoft.com/directx/default.asp。

DirectDraw就是DirectX5的6个组件之一。DirectX5的其它5个组件分别是:

Direct3D 提供了3D硬件接口。

DirectSound 立体声和3D声音效果,同时管理声卡的内存。

DirectPlay 支持开发多人网络游戏,并能处理游戏中网络之间的通信问题。

DirectInput 为大量的设备提供输入支持。

DirectSetup 自动安装DirectX驱动程序。

而DirectDraw则是DirectX的基础,DirectX的其它组件都是建立在它的基础之上的。DirectDraw使用页面切换的方法实现动画,它不仅可以访问系统内存,还可以访问显示内存,这是以往的Windows程序员所不能的。(例如:如果你是用MFC中的CDC类进行绘图,那么它是绝对不会让您直接访问显存的。) 另外,我们利用DirectDraw还可以生成、移动、剪切、转换、合成图像数据,从而编写出各种“炫丽多彩”图形的应用程序。

您先不要急,我们会在后面附上本文介绍的动画程序原代码,只要将其用vc打开,进行工程的编译创建后,您就会立刻看到效果。并且我们在工程文件中有详细的中文注释,力求将理论与实践紧密联系在一起。

首先,让我们先了解一下DirectDraw的三个重要概念――表面、Bltting、色彩键码

1.表面

在用DirectDraw编写程序时,我们先要创建若干个图形数据缓冲区,并把这些图形数据装入其中,再进行转换、拉伸、挎贝等操作,并且还可以显示这些缓冲区中的图形数据,这些缓冲区就称为表面。

表面可以分为几类。

主表面(primary surface)是用户在屏幕上可以看到的,它是显示内存的一部分。所有DirectDraw程序都有主表面,而且只有一个。它在DirectDraw表面对象之前就已经存在了,因此不能改变它的尺寸、格式和位置。

主表面有一个很重要的特性――翻页(flip)。页面翻页用于程序中,可以产生相当平滑、不闪烁的动画。一个可以翻页的主表面实际上是两个表面,一个是可见的,一个是不可见的。不可见的表面称为后备缓冲区。当发生表面翻页时,后备缓冲区就成为可见的,而以前的可见主表面则成为后备缓冲区。 下面我们用图示来向您解释上面的概念:

当翻页后,将原后备缓冲区页中的内容copy入可见主表面页,而同时将原可见主表面页的内容copy入后备缓冲区页。

显示器屏幕虽然每秒中刷新很多次,在此我们假定为85次,但每次都是一遍一遍地读取可见主表面中存储的显示页信息,而你对后备缓冲区的改动不会显示出来,并且也不会影响可见主表面的显示,而只有当施行翻页操作后,两页的内容互换,而你已经完成了的在原后备缓冲区的改动才会显示在屏幕上,而这个互相拷贝的过程几乎是瞬间完成的,这个时间比起每次刷新所用的时间少得多得多,两者几乎差了几乎几十万个数量级。而人眼是根本察觉不到的,所以用这种方法可以不闪烁,平滑,优质的动画效果

还有一种表面叫离屏表面(off_screen surface),它是不能直接见到的。离屏表面作为存储缓冲区,有助于表面之间的互相切换,它的大小是可以改变的。

主表面和离屏表面都分为有调色板的和无调色板的这两类。像素深度为8位(256色)的表面称为有调色板的表面;而像素深度为16位(64K色)、24位(16M色)的像素表面称为无调色板的表面,它们存储实际的色彩值(RGB值)。

在本文下面的程序中,我们先使用256位表面即有调色板的表面。

2. Bltting

Bltting是用于复制图形的语言,可以将图像从一处拷贝到另一处。例如大家所熟悉的CDC类(设备描述表类)的BitBlt()就是具有这样功能的函数。

在DirectDraw中,典型的blt操作是将离屏表面的内容拷贝到一个后备缓冲区,而一般的blt操作调用一个源表面和一个目标表面,把源表面的内容拷贝到目标表面中,不仅可以整体拷贝源表面,而且还可以拷贝源表面内的任何矩形区域到目标表面的任何位置。blt还支持透明拷贝,就是指表面中的某一像素在blt过程中可以不予以拷贝,而这个像素值是由色彩键码(DDCOLOR KEY )决定的。如图:

DirectDraw中有三个支持blt的函数,它们是

Blt()

BltBatch()

BltFast()

Blt( )用得最多,BltFast()的速度比Blt()要快,但功能却很有限,例如不支持拉伸、剪切等操作。

还有一个函数BltSurface(),它是DirectWin类的一个成员函数,Blt()、BltFast()更具有适应性,并且使用起来更加简单。例如,当我们把源表面拷贝到目标表面外时需要裁剪,而BltFast()不支持裁剪。这时我们使用BltSurface()函数,它在内部使用Blt()和 BltSurface()函数,并根据情况自动执行裁剪。

在此,有人会问,这种页面切换的方法到底好在那里?它到底与用一般的绘图方法的区别在什么地方?而其它的绘图方法为什么会使屏幕闪动呢?下面我们举二个例子:(我们仍然用图示的方法给您一个直观的解释)

(1) 在一些绘图程序中您会发现其用到了清屏函数,这种方式是使屏幕效果最差的,这种方法使得没有直接从第一个画面切换到第二个画面,而是先用黑色将图形数据缓冲区清空,并且还显示在屏幕上,但这个时间很短。如果反复清屏,则会产生严重的屏幕闪烁。如下图:

(2)在一些程序中用异或的方式进行绘图,即先在屏幕上画出第一个图像,然后在画第二个图像之前,再在屏幕上画一遍第一个图像,这样起到清除第一个图像的效果。如果您仔细看,会发现这样就会比上一个方法的画面效果好得多,但这并不是很完美,因为如果反复使用,虽然不会产生全屏幕的闪动,但在所清除图像处会产生闪烁。究其根本原因还是因其没能直接从第一个画面切换到第二个画面。如下图:

我想现在您应明白DirectDraw绘图的优势了吧,其实这就是对上述方法中缺点的很好的解决方法。

3.色彩键码

DirectDraw 可以把某种颜色或某个范围的颜色指定为一个颜色值,这个颜色值是由DDCOLORKEY结构即色彩键码说明的,DDCORLORKEY结构说明如下:

typedef struct _DDCOLORKEY

{

DWORD dwColorSpaceLowValue; //颜色范围的低端

DWORD dwColorSpaceHighValue; //颜色范围的高端

} DDCOLORKEY;

当我们对表面进行拷贝操作时,表面中哪些像素不被拷贝是由色彩键码决定的。例如当DDCOLORKEY结构的两个分量都为零时,表面内所有置为零的像素都不能被拷贝。又例如,当表面是24位RGB模式时,若想指定RGB=(120,120,120)像素不被拷贝,则应该:

DDCOLORKEY ddck;

ddck.dwColorSpaceLowValue=RGB(120,120,120);

ddck.dwColorSpaceHighValue=RGB(120,120,120);

surf→SetColorKey(DDCKEY_SRCBLT,&ddck);

其中SetColorKey()函数是把色彩键码赋给表面surf。这样,在对表面surf的 blt操作期间RGB值为(120,120,120)的像素不能被拷贝。

OK,我们现在已经具备基本的DirectDraw的知识,下面我们就来进行实战演练

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有