DIRECTX中独占模式和窗口模式切换档.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DIRECTX中独占模式和窗口模式切换档

文章标题: DIRECTX中独占模式与窗口模式的切换(1.1) 最近在GAMEDEV上发现了这篇文章,觉得挺不错的,特此翻译过来,有不对的地方希望大家指正 DIRECTX中独占模式与窗口模式的切换 介绍 让你的游戏能够在独占(全屏)模式与窗口模式下运行应该很简单,但想要让它合理且优雅的运行就要多做些工作了.在这篇文章中,我将用业界十分常用的C++语言来讲解这方面的技术,如果你想,可以用类把这个例子封装起来以便于使用. 我假设你已熟悉独占模式下的DirectDraw的设置与使用,这里我不再赘述,让我们开始吧! 设计 DirectDraw窗口模式下的初始化有好多与独占模式不同.最好的方法是在你程序的开始就创建DirectDraw对象,第二步再创建所有表面,设置协调层级和显示模式,初始化你需要的变量,等等.独占模式与窗口模式的不同都体现在这第二步中,所以,你的函数可以写成这样: void CreateDirectDraw(); void DestroyDirectDraw(); 和 void CreateSurfaces(bool bExclusive, int nWidth, int nHeight, int nBPP); void DestroySurfaces(); 第一部分(CreateDirectDraw and DestroyDirectDraw)分别创建和销毁DirectDraw对象.你自己应该可以完成的.第二部分(CreateSurfaces and DestroySurfaces)解决所有除去创建和销毁DirectDraw对象以外的事.看看参数 bExclusive,它表明创建一个独占模式的表面或窗口模式的表面以及相关的各个对象. 参数 width, height,bpp用以描述显示模式(当bExclusive为true时) 我们需要稍微改变游戏循环以正确处理窗口模式.为了正常改变窗口模式我们增加了一个函数: void SwitchMode(bool bExclusive, int nWidth, int nHeight, int nBPP); 继续来看如何实现这此些函数! CreateSurfaces 我们把这个函数分成两部分,分别实现独占模式和窗口模式下的DirectDraw的初始化,如下: if( bExclusive ) { // exclusive code // save the mode g_bExclusive = bExclusive; } else { // windowed code // save the mode g_bExclusive = bExclusive; } 你还需要创建一个全局变量g_bExclusive用以标志当前的模式,在游戏循环中要用到它的.请明确g_bExclusive的重要性,我们借此追踪模式 你可以把你以前的代码放到exclusive部分,用参数nWidth, nHeight, 和 nBPP设置显示模式等.然后让我们一起来完成windowed部分的代码(我用了几个函数来实现,都将它们分成了两部分,就像你在这个函数里看到的一样) 就和我前面提到的一样,当这个函数被调用时, DirectDraw已经创建,所以初始化DirectDraw的下一步是通过lpDD-SetCooperativeLevel()来设置协调层级. 把主窗口的句柄和DDSCL_NORMAL作为参数传给它: lpDD-SetCooperativeLevel(hMainWnd, DDSCL_NORMAL); 如果你想使用多线程,把标识DDSCL_MULTITHREADED与DDSCL_NORMA相与传给它就是了,但注意:在窗口模式下不能设置显示模式!所以下一步是创建主表面与后缓冲区. 在窗口模式下你需要一个完全不同的”缓冲系统”,你不能在创建主表面时连接一个后缓冲区然后调用flip()函数来翻转,为什么?因为你在窗口模式下不能独享显卡,而翻转是交换主表面和一个与其相连的后缓冲区的地址的过程,显然,你不能在窗口模式下这么做,因为此时你和其它应用程序共享主表面. 要使用窗口模式,应该用下面这个DDSURFACEDESC2结构去创建主表面: DDSURFACEDESC2 ddsd; ZeroMemory(ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; 这些语句创建的主表面将使用现在的屏幕格式,而且你不能修改(因为是窗口模式),也请注意我没有使用DDS

文档评论(0)

sy78219 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档