| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vc >> 多媒体游戏 >> 文章正文
DirectDraw 游戏编程基础(1)        【字体:
DirectDraw 游戏编程基础(1)
作者:-    文章来源:-    点击数:    更新时间:2006-4-20

微软公司供稿
内 容

1. 简介
2. 使用 DirectX 3 SDK的基本环境
3. DirectDraw API
4. DirectDraw, OLE, 和COM接口
5. DirectDraw 起步
6. DirectDraw 的基本知识 (DDEX1)
7. 例一的扩展(DDEX2和DDEX3)
8. 生成简单的动画(DDEX4和 DDEX5)
9. 检验Duel例子
10. 关于最优化(Optimizations)和规范化(Customizations)
11. 下一步你应该干什么

简 介
DirectDraw是微软新近发行的DirectX 3软件开发工具箱(SDK)中的一部分。对那些不甚了解的人来说,DirectX 3 SDK是原来称为游戏SDK的最新版本。和在游戏SDK中一样,DirectX 3 SDK包含了一组动态链接库,用来图形加速,3D图形服务,声音加速,扩展连接,游戏杆操纵以及CD-ROM自动化。
关于DirectX 3 SDK可以有很多的话题讨论,本篇只涉及如何用DirectDraw来编写游戏中的图形部分。尽管需要一些有关OLE和构件模型(COM)接口的基础知识,整个过程还是相当简单的。而且,所需的有关OLE和COM接口的知识也将在此讨论到。
读完本篇后,您就可以用DirectDraw来写简单的游戏了。在这里,我只想讨论如何使用最基本的DirectDraw函数。所举的例子仅涉及到全屏和翻页,不讨论如何在窗口中使用DirectDraw,在3维图中使用文字,使用视频剪接或是用Direct3D生成表面。如果对这些内容感兴趣,可以参阅有关的文档。

使用 DirectX 3 SDK的基本环境
DirectX 3 SDK可以在Windows 95或Windows NT4.0中使用。基于本文的目的,假定使用的环境是IBM PC和Windows 95.另外,还需要安装DirectX 3 SDK,以便编译连接应用。
同时,使用的C或 C++ 编译器应能生成32位的应用。您也可以使用其他的语言,但这里并不想涉及。当然您还应当具有Windows的编程技术。
如果使用的是C编译器,则还必须包含Win32 SDK。Win32 SDK包含了生成可执行程序时的一些库。

DirectDraw API
DirectDraw是整个软件开发工具箱的一个构件。DirectDraw是为速度而设计的,它绕过与Windows的图形设备相连的多个层次,直接与硬件的底层打交道。这很适合游戏编程来,因为它着重于快速产生平稳的图形。
但DirectDraw最重要的一点在于它对不同的显示适配器具有一个共同的接口。您不必管您的程序它是否会工作。DirectDraw利用包含在硬件抽象层(HAL)中的信息来决定显示适配器的功能。(HAL是由显示适配器厂商提供的)HAL为不同的硬件厂商和使用.DirectDraw的开发者提供了共同的接口。
然而,DirectDraw并不只限于利用显示适配器的硬件功能。如果您的程序指定了某一种特定的显示适配器,例如XXXX hardware blitter,但用户并没有该硬件,程序就会使用DirectDraw的硬件仿真层(HEL)。在这种情况下,DirectDraw利用内建的硬件仿真来仿真缺少的硬件。

图一说明了DirectDraw和其他Windows显示构件的联系。

图1. DirectDraw和其他Windows显示构件

DirectDraw API由DirectDraw对象组成,它表示具体的显示适配器。另外,DirectDraw API还包括表示surface的DirectDrawSurface对象,表示surface调色板的DirectDrawPalette对象和表示剪接列表的DirectDrawClipper对象。可以用DirectDraw对象来创建DirectDrawSurface和DirectDrawPalette对象。(也可用DirectDraw对象来创建DirectDrawClipper对象,但该剪接对象也可被独立地创建。这就涉及到另外的话题了。)创建全屏游戏要用到的只是DirectDraw,DirectDrawSurface和DirectDrawPalette对象。
要了解这些对象是如何工作的,必须对OLE和COM接口有基本的了解。COM接口是所有DirectDraw编程的基础。下一节将讨论COM接口,如果您熟悉OLE,则可跳过它。

DirectDraw, OLE, 和COM接口

DirectDraw是围绕着OLE和COM接口来设计的。如果您不熟悉OLE编程,那将很难开始用DirectDraw编程,这是最基本的一点。尽管在很多书上解释了很多概念,介绍OLE和COM接口是如何工作的,但要用好DirectDraw其实只要了解有限的一些。
首先看看OLE和COM的定义。OLE是微软为在不同的进程和机器间共享信息和服务而引进的基于对象的技术。COM指的是构件对象模型,在OLE编程中,它是接口模型。知道这些概念后就可不理它们了,因为这对我们编程并不重要。我们要继续深入的是为用好DirectDraw所需了解的COM接口的最少的知识。
从本质上说,COM接口由三个成员组成:对象,接口和方法。对象实质上是一个黑箱,不需要管它里面是什么,因为我们只是通过接口来与它打交道。而要完成这一过程,通过的则是方法。如果您有一些硬件知识的话,可以把一个对象想象成一集成电路。与集成电路(对象)通讯是通过管脚(接口)来发送或接收信号(方法)。
所有的COM接口都是从OLE的Iunknown接口派生来的。通过保持Direcdraw对象的引用次数,Iunknown接口维护对象的生存期。另外,它提供了决定对象可用接口的方法。Iunknown接口由三种方法组成:AddRef,Release和QueryInterface。
AddRef和Release负责保持对象的引用计数。当创建了一个对象的实例时,对象的引用计数设为1。只要函数返回了对象接口的指针,该函数必须通过得到的指针调用AddRef,将引用计数增加1。(另外,当另一个应用与该对象相连时,引用计数也要加1,对我们来说,这一点并不重要,因为我们并不将其他的应用连到游戏上。)
当用完一个接口后,要通过指针来调用Release,将引用计数减1。要收回一个对象时,它的引用计数必须为0。当对象的引用计数为0时,对象将被消除,它所有的接口都无效了。
第三个方法,QueryInterface,查询对象是否支持指定的接口。如果对象支持,则返回指向接口的指针。
AddRef,QueryInterface,和Release是如何与DirectDraw相连的呢?首先,我们没有理由在只用DirectDraw的简单游戏中使用AddRef和QueryInterface。DirectDraw创建了函数来负责增加引用计数并返回指向接口的指针。但您仍要对没一个隐式创建的接口指针执行Release操作。如果没有维护好对象的引用计数,将很容易引起内存泄露。在后面编码的例子中,将介绍如何进行。(也可在将应用与另一应用使用的DirectDraw对象相连时,使用AddRef和QueryInterface。同样,如果使用Direct3D,就不得不用QueryInterface来返回指向Direct3D接口的指针。这些内容都不在此讨论。)

下面看一个使用IDirectDraw接口方法的C程序行。
Ddrval = lpDD->lpVtbl->SetDisplayMode( lpDD, ScreenX, ScreenY, ScreenBpp );

程序用了SetDisplayMode方法来设置显示模式,返回值表示成功或失败。在此重要的一点是如何取得指向方法的指针,不能直接访问IDirectDraw接口方法。当一对象实例化时,它生成一个虚函数表,称为vtable,它包含了指向该对象接口方法的所有指针。在上例中,指向DirectDraw对象的指针(lpDD)指向了指向vtable的指针(lpVtbl),vtable中包含了对象所有方法的指针,具体地说,本例中指向了SetDisplayMode方法。应用和方法接口间的联系可以清楚地看成这样:

下一个例子看看如何用C++来做:

[1] [2] [3] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 一个用VC写的俄罗斯方块程序…

  • 关于飞机射击类游戏的设计原…

  • 中国象棋游戏源代码

  • 中国象棋人机对弈源码

  • 超级玛丽游戏源代码

  • 一个国产RPG游戏

  • 一个OpenGL例子

  • 三子棋游戏源码

  • 一个DirectX游戏的源码

  • 单机版的‘三子棋’游戏

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |