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

📄 g06.htm

📁 一本介绍如何开发游戏,如何进行游戏编程的非常值得一看的好书.
💻 HTM
📖 第 1 页 / 共 2 页
字号:
                DDERR_DIRECTDRAWALREADYCREATED│DirectDraw对象已经被创建<br>                DDERR_GENERIC         │DirectDraw不知道哪出错了<br>                DDERR_INVALIDDIRECTDRAWGUID  │GUID设备未知<br>                DDERR_INVALIDDIRECTDRAWGUID  │传递的参数有错(原文明显印错了)<br>                DDERR_NODIRECTDRAWHW     │没有任何硬件<br>                DDERR_OUTOFMEMORY       │大胆地猜猜看<br>                ────────────────┴───────────────<br>                常量和条件逻辑一起使用的唯一问题是,微软并不保证他们不会完全改变所有的错误代码。不过,在任何情况下你可以相当放心地使用以下代码:<br>                if(DirectDrawCreate(...)!=DD_OK )<br>                {<br>                //error<br>                }//end if<br>                而且,所有DirectDraw函数定义了DD_OK,所以你可以放心使用。</p>            <p><b>改进界面</b></p>            <p>   如上所示,你可以用存储在lpdd中基本IDirectDraw界面调用DirectDrawCreate()。或通过IUnknown界面的方法QueryInterface()设法找到新的界面,把界面升级到最新版本(不管它是怎样的)。QueryInterface()是每个DirectDraw界面的工具。DirectX               6.0版本的最新DirectDraw界面是IDirectDraw4,所以,以下是如何获得一个界面指针。<br>                LPDIRECTDRAW lpdd=NULL;//standard DirectDraw 1.0<br>                LPDIRECTDRAW lpdd4=NULL;//DirectDraw 6.0 interface 4<br>                //first create base IDirectDraw interface<br>                if(FAILED(DirectDrawCreate(NULL,&amp;lpdd,NULL)))<br>                {<br>                //error<br>                }//end if<br>                //now query for IDirectDraw4<br>                if(FAILED(lpdd-&gt;QueryInterface(IID_IDirectDraw4,<br>                                (LPVOID *)&amp;lpdd4)))<br>                {<br>                //error<br>                }//end if<br>                有两点需要注意:<br>                ·QueryInterface()调用的方式。<br>                ·用来申请创建IDirectDraw4界面的常量是IID_IDirectDraw4。<br>                通常,所有的界面调用都具有以下形式:<br>                interface_pointer-&gt;method(parms...);<br>                所有的界面标识符用以下形式:<br>                IID_IDirectCD<br>                在此,C指代组件:Draw代表DirectDraw,Sound指代DirectSound,Input代表DirectInput,等等。D是个编号,从2到n,表明了你想要的界面。另外,你可以在DDRAW.H文件中找到这些常量。<br>                继续这个例子,你可能有点尴尬,因为你现在有一个IDirectDraw界面,一个IDirectDraw4界面。该怎样做呢?既然你不需要旧的界面,就把旧的界面释放掉,做法如下:<br>                lpdd-&gt;Release();<br>                lpdd=NULL;//set to NULL for safety<br>                从现在开始,所有的方法调用都使用新的IDirectDraw4界面。<br>                <b>警告:</b>IDirectDraw4的新功能使一切变得井井有条,这不仅仅是因为IDirectDraw4界面更为先进和完美,而且在许多情况下IDirectDraw4界面需要并返回新的数据结构,而不是DirectX               1.0定义的基本结构。了解这些变化的唯一途径是查看DirectX SDK文献,检查具体的函数所需的或(和)返回的数据结构的版本,然而,这只是一般的警告,本书中,我将给出你要完成的所有例子的正确的结构。<br>                除了在最初的IDirectDraw界面指针(lpdd)中使用QueryInterface()函数外,还有一种可以直接得到IDirectDraw界面的“COM方式”。这种方式更为直接。在COM下,只要你有界面标识符或称IID(代表你想要的界面),你就可以得到任何界面的界面指针。大多数情况下,我个人不喜欢使用低水平的COM函数。<br>                尽管如此,当你接触到DirectMusic时,除了使用低水平的COM函数外没有其他方法。所以,至少在此适当介绍一下这个过程。通过以下代码,你就可以直接创建一个IDirectDraw界面:<br>                //first initialize COM,this will load the COM libraries<br>                //if they aren't already loaded<br>                if(FAILED(Coinitialize(NULL)))<br>                {<br>                //error<br>                }//end if<br>                //Create the DirectDraw object by using the<br>                //CoCreateInstance() function<br>                if(FAILED(CoCreateInstance(&amp;CLSID_DirectDraw,<br>                               NULL,<br>                               CLSCTX_ALL,<br>                               &amp;IID_IDirectDraw4,<br>                               &amp;lpdd4)))<br>                {<br>                //error<br>                }//end if<br>                //now before using the DirectDraw object,it must<br>                //be initialized using the initialize method<br>                if(FAILED(IDirectDraw4_Initialize(lpdd4,NULL)))<br>                {<br>                //error<br>                }//end if<br>                //now that we're done with COM,uninitialize it<br>                CoUninitialize();<br>                前面的代码是微软推荐创建DirectDraw对象的方法。但这个技术有些不可靠,也只使用了一个宏:<br>              IDirectDraw4_Initialize(lpdd4,NULL);<br>                你可以去掉(1),使用<br>                lpdd4-&gt;Initialize(NULL);<br>                将其代替,使之全部成为COM。(1)(2)式中的NULL是视频设备,在本例中视频设备是系统设定的驱动器(这就是为什么要填为NULL的原因)。总之,不难明白前面的宏是怎样扩展为代码。我想可能是可以变得容易些。但是,为什么微软不继续利用宏来创建新界面,如:<br>                DirectDrawCreate(...);<br>                那不是更好吗?但为什么要问为什么呢?我的观点是你应当自己这样做,这样你的程序代码看起来就会相当统一。<br>                现在,你已经知道怎样创建一个DirectDraw对象,以及怎样获得最新的界面。那我们就进行下一步——设置协作等级。 </p>            <p><b>和Windows协同工作</b></p>            <p>  众所周知,Windows是一个协作、共享的环境。虽然作为一个程序员,我至今还没有想到怎样使得我的程序与Windows协同工作,但这至少是一种概念。无论如何,DirectX和任何Win32系统相似。最低限度,DirectX准备调用不同资源时必须通知Windows。这样Windows其他的程序就不会请求调用DirectX所控制使用的资源。基本上,DirectX是一个完整的资源体,Windows知道它在做些什么。<br>                在DirectDraw例子中,你唯一需要感兴趣的是视频显示硬件,下面两个模式值得注意:<br>                ·全屏模式<br>                ·窗体模式<br>                在全屏模式中,DirectDraw的运行很像旧的DOS程序。这就是说,DirectDraw给你的游戏分配了全屏画面,你可以直接对视频硬件进行操作。没有其他的应用程序能够接触到硬件。窗体模式有点不一样。在窗体模式中,DirectDraw更多的与Windows协作,因为其他的应用程序可能需要更新自己的客户窗体区域(对使用者是可见的)。因此,在窗体模式中,你对视频硬件的控制和独占受到了限制。然而,你仍然有足够的权限使用2D和3D加速,这是好事。但另一方面,首先会是上窄下宽...<br>              <br>                 </p>            <p> 进入事件模式</p>            <p>&nbsp;</p>            <p> 巧妙的色彩</p>            <p>&nbsp;</p>            <p> 创建一个显示画面</p>            <p>&nbsp;</p>            <p> 总结</p>            <p>&nbsp;</p>            <p>[<a href="index.html">目录</a>][<a href="g05.htm">上一页</a>][<a href="g07.htm">下一页</a>]             </p>            </td>          </tr>        </tbody>      </table>    </td>  </tr></tbody></table><script language="javascript">bottomprint()</script></body></html>

⌨️ 快捷键说明

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