⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g06.htm

📁 一本介绍如何开发游戏,如何进行游戏编程的非常值得一看的好书.
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up.js"></SCRIPT><SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up-all.js"></SCRIPT><html><head><title>易都网--Windows游戏编程大师技巧</title><LINK rel="stylesheet" href="../../_public/javaa.css"><meta http-equiv="Content-Type" content="text/html; charset=GBK"><script language="JavaScript" src="../../_public/javaa.js"></script><meta name="keywords" content="Java,JSP,ASP,PHP,J2EE,EJB,JavaScript,C/C++,ASM,CSS,HTML,XML,网络安全,MySQL,ACCESS"></head><body bgcolor="#FFFFFF"><table border=0 cellpadding=0 cellspacing=0 width="100%">  <tbody>   <script language="javascript">print2()</script>  <tr>     <td width="100%">       <table bgcolor=#EEEEEE border=0 cellpadding=3 cellspacing=0 width="100%">        <tbody>         <tr>           <td class=f1 id=thetd width="100%">             <p>[<a href="index.html">目录</a>][<a href="g05.htm">上一页</a>][<a href="g07.htm">下一页</a>]</p>            <p align="center"><b>第六章 首次接触:DirectDraw</b></p>            <p>  在本章中,将第一次接触到DirectX的最重要的组成部分之一:DirectDraw。DirectDraw可能是DirectX中最重要的技术,因为它沟通了2D图形的显示和Direct3D所依赖的帧缓冲层。只要掌握了DirectDraw,就能够编写各种在DOS16/32下编写的图形应用程序。DirectDraw是理解DirectX中许多概念的关键,所以要特别注意。<br>                以下是本章的主要内容:<br>                ·DirectDraw的界面<br>                ·创建一个DirectDraw对象<br>                ·与Windows协同工作<br>                ·进入事件模式<br>                ·巧妙的色彩<br>                ·建立一个显示画面</p>            <p><b>DirectDraw界面</b></p>            <p>  DirectDraw由一些界面组成。如果掌握了第五章关于COM的讨论,即“DirectX基础和令人生畏的COM”,可以知道界面只不过是一些用来和组件联系的函数和(或)方法的集合体。图6.1给出了DirectDraw界面的示意图。             </p>            <p>                一切都源自“主COM对象” <br>                                ↙<br>                            ┌──────┐<br>                            │IDirectDraw│<br>                            └──┬───┘<br>                ┌──────────┐┌──┴──┐┌──────────┐<br>                │IDirectDrawPalette ├┤IUnknown ├┤IDirectDrawSurface │<br>                └──────────┘└──┬──┘└──────────┘<br>                          ┌────┴─────┐<br>                          │IDirectDrawClipper │<br>                          └──────────┘ <br>                          图6.1 DirectDraw界面</p>            <p><b>界面特征</b></p>            <p>  从图中可以看到,DirectDraw由5个界面组成:<br>                <b>IUnknown</b>——所有的COM对象必须从这个基本界面中获得,DirectDraw也不例外,IUnknown只包含了被其他界面覆盖的Addref()、Release()及QueryInterface函数。<br>                <b>IDirectDraw</b>——这是一个必须创建出同DirectDraw一起开始工作的主要界面对象。IDirectDraw字面上表示视频卡和支持硬件。有意思的是,现在在MMS(多监视支持)和Windows               98/NT下,你可以在系统中安装多个视频卡,因此就会有多个DirectDraw对象。不过,本书中,即使系统中有多个卡,我们也假定在计算机中只有一个视频卡,而且总是选择一个默认卡代表DirectDraw对象。               <br>                <b>IDirectDrawSurface</b>——这代表你将创建的实际显示画面,显示时需要利用到DirectDraw。视频卡仅利用本身的VRAM(视频RAM)而不用系统的存储器就能存储一个DirectDraw画面。<br>                主画面通常是代表正在被视频卡光栅化并显示的实际视频缓冲,另一方面辅助画面通常不在显示区内。大多数情况下,你只需创建一个最初的画面表示实际视频显示,然后创建多个辅助画面表示对象位图和(或)用反向缓冲代表后备作图区。在此后备作图区中生成下一幅动画帧。在本章的后面部分将对画面的一些细节问题进行介绍。图6.2显示了一个图画的制作。               <br>                <b>IDirectDrawPalette</b>——DirectDraw可以处理任何色空间,从1位单色到32位真彩色。所以,DirectDraw支持IDirectDrawPalette界面处理使用256色或较少彩色的显示方式的调色板。这种情况下,你在一些演示中应多使用256色模式,因为对于软件光栅来说,256色是最快的模式。在第二册中有关Direct3D即时模式的讨论中你将转而用24位色彩,因为24位色彩是Direct3D工作的基本方式。本例中,IDirectDrawPalette界面用来创建、加载、操作调色板及调用调色板来画图,如主画面及辅助画面,图6.3表示了画面和DirectDraw调色板之间的联系。               <br>                <b>IDirectDrawClipper</b>——IDirectDrawClipper用于一些可视显示面的子集剪切DirectDraw光栅和位图操作。大多数情况下,只在视窗DirectX应用程序软件中使用DirectDraw剪切器,和(或)用DirectDraw剪切器在显示画面的区域里对位图进行剪切。IDierectDrawClipper界面的优点是:如果有相应的硬件,IDirectDrawClipper界面能利用硬件加速,而且可以对在屏幕区域内通常需要剪切位图的像素及图像进行处理。<br>                在创建一个DirectDraw对象前,需要重新回顾一下上一章关于COM的内容。DirectDraw和所有的DirectX组件都处于稳步发展中,界面一直在升级。因此,即使到现在为止,本章中涉及到DirectDraw的界面从类属上说是指IDirectDraw、IDirectDrawSurface、IDirectDrawPalette及IDirectDrawClipper,大部分界面已经更新,而且有了更新的版本。如IDirectDraw升级到DirectX第6版的IDiretDraw4。<br>                所以,如果想要得到最近的软件和硬件性能,就需要使用IUnknown::QueryInterface()函数获得最新的修订版本。如果想弄清楚,须参看DirectX               SDK手册。当然,本书中,使用DirectX 6.0,所以知道哪些是最新的界面,但是,要记住,当升级到7.0版本的时候就会有一些你想要的更新的界面。然而,本书的两部分内容都是关于光栅转换和3D软件的。所以,它是很实用的。在大多数情况下,你在新版本中也几乎用不上别的技巧。</p>            <p><b>界面的协同使用</b></p>            <p>  下面,将简单介绍用这些界面如何创建一个DirectDraw应用程序:<br>                1.创建主DirectDraw对象,得到一个IDirectDraw4界面。在此界面上,设置协同等级和视频模式。<br>                2.在IDirectDrawSurface界面上,创建至少一个主画面。基于画面的色深及视频模式。如果视频模式为每像素8位或更少,则需要使用调色板。<br>                3.在IDirectDrawPalette界面上创建一个调色板,用RGB三元组初始化调色板,并把调色板附在界面上。<br>                4.如果DirectDraw程序带有一个窗体,或对一个可能出了DirectDraw可视界面边界的位图进行着色时,你就需要创建一个剪切工具,并把它调整到可视窗体的区域中。如图6.4所示。<br>                5.在主画面上画图。<br>                当然,上述步骤省去了许多细节,但这是使用不同界面的精髓。下面我们开始认真地探讨细节问题并使这些界面真正地工作。</p>            <p><b>创建DirectDraw对象</b></p>            <p>  用C++创建一个DirectDraw对象,你需要调用DirectDrawCreate()函数,如下:<br>                HRESULT WINAPI DirectDrawCreate(GUID FAR *IpGUID,//guid of object<br>                        LPDIRECTDRAW FAR *lplpDD,//receives interface<br>                        Iunknow FAR *pUnkOuter);//com stuff<br>                <b>lpGuid</b>——这是你所需要的显示驱动的GUID(全局统一标识符)。大多数情况下,你只须用NULL代替默认硬件。<br>                <b>lplpDD</b>——这是一个指向获得IDirectDraw指针的指针,注意:lplpDD返回一个IDirectDraw界面,而不是IDirectDraw4界面。<br>                <b>pUnkOuter</b>——高级特征:通常设置为NULL。<br>                以下是在IDirectDraw界面上创建一个默认DirectDraw对象使用的程序:<br>                LPDIRECTDRAW lpdd=NULL;//storage for IDirectDraw<br>                //create the DirectDraw object<br>                DirectDrawCreate(NULL,&amp;lpdd,NULL);<br>                如果程序执行成功的话,lpdd将成为一个有效的IDirectDraw对象界面。如果你想得到最新的界面IDirectDraw4,得先了解一下DirectDraw的错误处理。</p>            <p><b>DirectDraw的错误处理</b></p>            <p>  DirectX中的错误处理是十分清楚的。有一些能够测试出任何程序或函数执行是否成功的宏。对DirectX函数中的错误进行测试采用微软授权的两个宏。<br>                <b>FAILED()</b>——对错误进行测试。<br>                <b>SUCCEEDED()</b>——对成功进行测试。<br>                在此基础上,应加上以下的错误处理代码:<br>                if(FAILED(DirectDrawCreate(NULL,&amp;lpdd,NULL)))<br>                {<br>                 //error<br>                }//end if<br>                同样,判断测试是否成功,你可以加上以下代码:<br>                if(SUCCEEDED(DirectDrawCreate(NULL,&amp;lpdd,NULL)))<br>                {<br>                //move on to next step<br>                }//end if<br>                else<br>                {<br>                //error<br>                }//end else<br>                我通常使用FAILED()宏,因为我不喜欢有两个不同的逻辑路径。但不管怎样,这个宏的主要问题是它本身并不能告诉你很多,它们更倾向于检测常规问题。如果你想知道确切的问题,你可以浏览一下程序返回的代码。表6.1列出了DirectX               6.0版本中DirectDrawCreate()函数返回的代码。</p>            <p>       <b>表6.1 DirectDrawCreate()返回的代码</b><br>                ────────────────┬───────────────<br>                   返回代码         │说明 <br>                ────────────────┼───────────────<br>                DD_OK             │成功<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -