专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »项目管理 » directdraw:用DirectDraw编写动画程序 »正文

directdraw:用DirectDraw编写动画程序

来源: 发布时间:星期五, 2009年1月9日 浏览:26次 评论:0
  理论篇

  说起DirectDraw也许大多数人还不知其为何物提到DirectX恐怕每个Computer Fan 和Game Fan都再耳熟不过了(什么!你没听说过DirectX!?Oh,My god!来人哪拉下去重责 5十大板!)DirectX又叫Game SDK它最大特点是直接对硬件抽象层(HAL)进行操作利用这个特点可以制作出高性能Windows游戏具体信息请见http://www. microsoft.com/directx/default.asp

  DirectDraw就是DirectX56个组件的DirectX5其它5个组件分别是:

  Direct3D:提供了3D硬件接口

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

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

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

  DirectSetup:自动安装DirectX驱动

  而DirectDraw则是DirectX基石DirectX其它组件都是建立在它基础的上DirectDraw使用页面切换思路方法实现动画它不仅可以访问系统内存还可以访问显示内存这是以往Windows员所不能另外我们利用DirectDraw还可以生成、移动、剪切、转换、合成图像数据从而编写出各种“炫丽多彩”图形应用

  介绍了这么大堆DirectX理论头是不是已经有些大了呢?心中定在嘀咕:“哼原来是个江湖骗子光说不练”各位看官不要着急不把这些基础理论搞懂就去看下面你肯定是“洋鬼子看戏——目瞪口呆”

  首先让我们先了解下DirectDraw 3个重要概念

  1.表面

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

  表面可以分为几类

  主表面(primary surface)是用户在屏幕上可以看到它是显示内存部分所有DirectDraw都有主表面而且只有它在DirectDraw表面对象的前就已经存在了因此不能改变它尺寸、格式和位置主表面有个很重要特性——翻转页面翻转用于可以产生相当平滑、不闪烁动画个可以翻转主表面实际上是两个表面个是可见个是不可见不可见表面称为后备缓冲区当发生表面翻转时后备缓冲区就成为可见而以前可见表面则成为后备缓冲区

  还有 砻娼欣肫帘砻?off_screen surface)它是不能直接见到离屏表面作为存储缓冲区有助于表面的间互相切换大小是可以改变

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

  2. Bltting

  Bltting是用于复制图形语言可以将图像从处拷贝到另例如大家所熟悉CDC类(设备描述表类)BitBlt就是具有这样功能在DirectDraw中典型blt操作是将离屏表面内容拷贝到个后备缓冲区blt操作个源表面和个目标表面把源表面内容拷贝到目标表面中不仅可以整体拷贝源表面而且还可以拷贝源表面内任何矩形区域到目标表面任何位置blt还支持透明拷贝就是指表面中像素在blt过程中可以不予以拷贝而这个像素值是由色彩键码(DDCOLOR KEY )决定

  DirectDraw中有 3个支持blt它们是Blt、BltBatch、BltFastBlt( )用得最多BltFast速度比Blt要快但功能却很有限例如不支持拉伸、剪切等操作

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

  3.色彩键码

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

  typedef struct _DDCOLORKEY{
   DWORD dwColorSpaceLowValue; //颜色范围低端
   DWORD dwColorSpaceHighValue; //颜色范围高端
   } DDCOLORKEY;
  当我们对表面进行拷贝操作时,表面中哪些像素不被拷贝是由色彩键码决定例如当DDCOLORKEY结构两个分量都为零时表面内所有置为零像素都不能被拷贝又例如当表面是24位RGB模式时若想指定RGB=(120120120)像素不被拷贝则应该:

  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)像素不能被拷贝

   2.实战篇

  古语云:“君欲善其事必先利其器”在编写DirectDraw应用的前我们先要准备好以下工具:

  Windows95、Windows98或WindowsNT4.0

  DirectX 驱动(最好是DirectX3.0以上版本)

  DirectX SDK

  Visual C++ 5.0

  Direct SDK包括开发基于DirectX应用所需全部文件全部安装需要80几兆硬盘空间其实你只需安装必需头文文件(.h文件)和库文件(.lib文件)就行了

  安装完DirectX SDK需要通知Visual C++ DirectX SDK路径具体做法是:在VC编译环境中依次把Tools-Options-Directories中Show Directories for栏中 files和library files中分别填入SDKinc和lib目录如图1所示

  再准备两幅bmp格式位图要求24位(16M色)其中background.bmp作背景如图2;另幅bird.bmp作为子画面如图3bird.bmp是由4幅小画面组成从左到右从上到下分别为动画1至4帧这样做是避免过多位图文件带来不必要麻烦还要注意是子画面背景要为黑色(RGB=(0,0,0))在下面色彩键码把黑色设为透明色

  好切准备就绪让我们开始吧!

  进入VC5编程环境File-New-Project,选择DirectDraw AppWizard,输入项目名Fly,按下Ok,以后每步都按其缺省值即可这样AppWizard就会自动创建个项目Fly属性如下:

  APPLICATION STYLE
   Full-Screen
   SETTINGS
   640x480
   16-bit
   CLASS NAMES
   FlyApp
   FlyWin
   CONTENT
   Bitmap
  这时按“Ctrl+F5”编译运行你就会看到个“ 3角形”在屏幕上撞来撞去
  在FlyWin.h中添加代码如下所示:
  #ndef FLYWIN_H
  # FLYWIN_H
  # “DirectDrawWin.h”
  
   FlyWin : public DirectDrawWin
   {
   public:
   FlyWin;
   protected:
   //{{AFX_MSG(FlyWin)
   afx_msg void _disibledevent=DD_OK) ;
   }
   DDSURFACEDESC为表面描述结构用以保存表面所有信息成员变量dwSize为结构大小而且必须要被化;dwHeight为表面高度;dwWidth为表面宽度GetSurfaceDesc可以获取上述描述信息

  DirectDraw首先CreateCustomSurface我们将在这个中创建和准备所用到表面DrawSence负责更新屏幕因此我们用它来显示背景画面我们主要工作都在OnTimer首先判断当前子画面为4帧子画面中然后进行页面翻转、显示子画面和复制背景区域等操作

  BltFast用于表面的间拷贝前两个参数指出blt目标表面位置第 3个参数是指向源表面指针第 4个参数是源表面上被拷贝矩形区域最后参数是DDBLTFAST_SRCCOLORKEY和DDBLTFAST_WAIT个标志用来激活源表面色彩键码;第 2个标志表示只有结束blt操作BltFast才返回

  Flip用于页面翻转操作使backsurf表面内容可见它有两个参数个参数是个表面指针它在用来翻转有多个后备缓冲区表面时才有用;第 2个参数是DDFLIP_WA

  IT标志用来指示只有在表面完成的后才能返回

  当运行时个表面所在内存可能会被另个应用所占用这形成了“表面丢失”这时DirectDraw会RestoreSurface来恢复丢失表面但是如果你显卡不是老掉牙了这种情况般是不会发生所以这里我只对两个主要表面bksurf、flysurf进行了恢复处理而不再管其它表面

  另外SelectDriver和SelectInitialDisplayMode是AppWizard自动创建SelectDriver选择个显示驱动SelectInitialDisplayMode选择显示模式

   3、结束语

  话已至此你对DirectDraw编程应有个大致了解了吧!用DirectDraw编程其实很简单说白了其实就是句话:“几个表面的间拷来拷去”只不过这其间可是大有文章可作哟!

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: