| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
C语言 DirectX游戏开发入门
作者:佚名    文章来源:不详    点击数:    更新时间:2006-9-8
  0正准备发布),但DirectDraw并没有7个版本。当DirectX6是最新版本时,DirectDraw的最新接口版本是IDirectDraw4,不是IDirectDraw6。现在最新的版本是DirectX7,所以我们要用IDrectDraw7。很奇怪,是不是?我想你已经明白了我的意思,请不用因为以后看到的感到困惑了。

  最后一件事。当我写这篇文章时,DirectX7是最新的可用版本,但或许现在你已经有了DirectX8,并且或许你还听说了,DirectDraw将不再升级了,取代它的是DirectX Graphics,这是一个功能强大的图形API。但DirectDraw不升级就意味着我们不学习它了,毕竟都离不开COM。如果你想用DirectX8的接口写2D的游戏,你需要用3D方法去创建2D观点。听起来很棒,是的,的确如此,因为使用3D接口将给你更多的硬件支持,例如阿尔发混合。但这也恰恰是个问题,如果机器没有相应的硬件设备,程序会以更慢的速度运行。

  DirectDraw是很容易学的。由于DirectX中的3D图形是基于DirectDraw的,3D应用程序在DirectDraw环境中执行;极少有应用程序专门使用3D。大多数程序使用3D函数对一些对象建模,而另一些对象,诸如背景和精灵,是以2D图形渲染的。所以本系列将使用DirectDraw。关于DirectX8,我还没有太多的了解,因此我只能对DirecX7做详细介绍。总的来说,你使用DirectX,还是离不开DirectDraw的。

六.DirectDraw概述

  在你的程序中使用DirectDraw,你至少要做四件事,它们是:

  1、建立一个DirectDraw对象。

  2、设置协作等级。

  3、设置显示模式和色彩深度(全屏模式)。

  4、至少创建一个DirectDraw表面。

  在讲怎样完成以上步骤之前,先让我们了解一下每一步的含义。第一个,要创建一个DirectDraw对象,这意味着我们要建立一个指向IDirectDraw7接口的指针。这很简单,不是吗?有三种办法可以实现它,你可以直接使用COM,或使用DirectDraw的两个函数之一。三种办法各有千秋,我们过一会儿将详细介绍。第二个,设置操作等级。这可能对你来说比较新鲜。协作是由于Windows是一个多任务操作系统而产生的概念。意思是所有运行的程序都要随时告知Windows它们将要或正在使用的资源,这将保证你所要使用的资源不会被windows再分配给别的应用程序。不用担心,有一个很简单的函数完成它。

  第三个你是否有点熟悉?如果你要写一个全屏的程序,通常是游戏程序,你需要设置显示模式和色彩深度。在Windows的应用程序里做这些通常不是一个好主意,因为它能导致其它程序的同时运行出现问题。当你结束自己的程序时,你当然要恢复到改变前的状态。设置全屏模式,只是调用一个单独的DirectDraw的函数,程序结束后,要恢复原来的状态。

  最后,也是最重要的,是DirectDraw表面的概念。操纵表面是DirectDraw的全部。简单的说,DirectDraw表面是一个用于存储图象数据的线性内存区域。DirectDraw表面的大小就是以象素为单位,用宽和高来定义。所以你可以认为表面是一个用来画图的矩形区域。它有自己的接口,称作IDirectDrawSurface7。有三种主要的表面,我们将在本章和下一章分别用到它们。

  · 主表面:每一个DirectDraw应用程序都有一个主表面。主表面就相当于用户的显示器。它的内容是可见的。同理,主表面就是根据显示器的显示模式设定宽和高。

  · 后缓冲区:后缓冲区是紧随主表面的表面,但它不可见。它是动画没有闪烁的主因,通常,你在后缓冲区画好每一帧,然后把后缓冲区的内容拷贝到主表面,使它显示出来。由于它紧随着主表面,所以它的大小同主表面相同。(你就理解为楼上和楼下的关系)

  · 离屏缓冲区:它很象后缓冲区,只是它不是紧挨着主表面。尽管你可以用它作任何事,但它经常被用来存储位图。离屏缓冲区你可以任意设置大小,唯一的限制是你内存的大小。

  DirectDraw表面可以在系统内存中建立,或直接建立在显示内存中。如果你都建立在显示内存中,速度效果将是最好的,如在系统内存就要慢一些了。如果你把一个表面存储在显示内存中,另一个在系统内存中,性能会有一些损失的,尤其是显示卡与主板之间有一个令人恶心的带宽。总之,如果能把表面都建立在显示内存中,你或许应该尽力做到。

  OK,我们总算有了一点儿认知,让我们看看具体怎么做吧!这儿有一个计划,我们将建立一个全屏模式下,16位色彩,640×480分辨率的程序,我将告诉你全部你需要做的。但开始前,你需要对Windows编程有一点了解。想必你看过了前面几章,应该对创建窗口已经熟悉了。由于这是一个全屏的程序,你不需要任何地窗口控制,所以你的窗口风格应该用WS_POUP|WS_VISIBLE。弄好了吗?All right,出发吧!
七.建立DIRECTDRAW对象

  象我前面说过的,有三种方法。我们可以用两个DIRECTDRAW函数中的任何一个,或者直接调用COM对象。让我们每一个都试试,使我们自己熟悉它们。我将告诉你的最后一个方法可能是目前为止最简单的,可能你会喜欢用它。至于另外两个,打眼儿一看,你会觉得有些奇怪。首先,看看DirectDrawCreate():



HRESULT WINAPI DirectDrawCreate(
GUID FAR *lpGUID,
LPDIRECTDRAW FAR *lplpDD,
IUnknown FAR *pUnkOuter
);



  看起来是不是有点儿复杂?HRESULT返回的类型是DirectDraw函数的标准。如果成功,返回值是DD_OK。如果失败,函数将返回一个错误常量,有几个错误常量供选择,但我不想细讲,更不想列出这些常量,反正你可以通过帮助文件随时查阅它们。但有一件事儿我得告诉你,有两个非常有用的宏可以帮助你知道函数调用成功与否:SUCCEEDED()和FAILED()。从字面上你就知道它们的分工了,是不是?只要把函数放到宏里面,你就知道结果了。无论如何,我们还得看看函数的参数:

  · GUID FAR *lpGUID:是一个全局唯一标识符(GUID)的地址,代表将要创建的驱动程序。如果该参数是NULL,那么该调用指向当前的显示驱动程序。新版本的DirectDraw允许向该参数传递下列两种标志之一,以控制当前显示的行为:

   DDCREATE_EMULATIONONLY:DirectDraw只使用仿真(HEL

上一页  [1] [2] [3] [4] [5] [6] [7] 下一页


相关文章