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

📄 csdn_文档中心_directx编程技术 --- 想学游戏编程吗必读.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 2 页
字号:
          <TD align=left><BR>
            <P align=center><FONT size=5><STRONG>DirectX编程技术</STRONG></FONT></P>
            <P>&nbsp;&nbsp;&nbsp; 
            大家对DirectX一定不陌生吧,因为在微软刚刚推出WINDOWS窗口操作系统时,由于显示界面采用统一的GDI,禁止程序员直接操作硬件,这使得在WIN 
            3.x系统上的游戏程序速度奇慢,根本无法推广。微软为了解决这一问题,曾经又推出过WING图形加速程序,但是由于WING缺乏广大游戏厂商的支持,也没有普及开来。所以我们当时玩的大部分游戏都是运行于DOS环境之下。<BR>&nbsp;&nbsp;&nbsp; 
            直到1995年,伴随着WINDOWS 
            95的诞生,微软公司正式公布了其新一代的游戏开发系统DirectX。DirectX以其高效的性能,统一的程序接口,使得其一推出便受到了各大游戏厂家的喜爱,并纷纷表示支持它,至此WINDOWS系统下的游戏开发时代才真正开始。<BR>&nbsp;&nbsp;&nbsp; 
            DirectX编程,将涉及到 WIN 95 和 C++ 
            的一些基本知识,所以在此之前您最好有这方面的基础,如果您不是很熟悉他们的话也不要紧,完全可以随着本文介绍一起学习,可谓一箭双雕。</P>
            <P>&nbsp;&nbsp;&nbsp; 
            好了,闲话少说开始进入正题:<BR>(一)DirectX由以下几个部分组成:<BR>&nbsp;&nbsp;&nbsp; 
            1、DirectDraw:通过直接访问显示内存和软硬件加速技术,实现快速直接存取。<BR>&nbsp;&nbsp;&nbsp; 
            2、DirectSound:提供软硬件声音混合和录音再生功能。<BR>&nbsp;&nbsp;&nbsp; 3、DirectPlay 
            :提供多人游戏的交互功能,让您轻松实现网上互连。<BR>&nbsp;&nbsp;&nbsp; 
            4、Direct3D:交互式的三维图形技术。<BR>&nbsp;&nbsp;&nbsp; 
            5、DirectInput:使你的程序能够控制输入设备如鼠标,键盘,和游戏杆等。<BR>&nbsp;&nbsp;&nbsp; 
            6、DirectSetup:完成DirectX驱动程序的安装。<BR>&nbsp;&nbsp;&nbsp; 
            7、AutoPlay:只要您把光碟一放入光驱它便会自动运行。<BR>&nbsp;  最后补充一句,我们讲到和用到的都是DirectX 
            5的东西,所以需要一套DirectX 5 SDK,你可以在时下一些光盘中找找,它是免费的。</P>
            <P>(二)正式编程之前的准备工作<BR>&nbsp;&nbsp;&nbsp; 要让VC++ 
            5能正确的编译、链接你的程序,你必须先在Microsoft Developer 
            Studio中进行如下设置,以使得编译器能够找到需要的链接库和包含文件。<BR>&nbsp;&nbsp;&nbsp; 
            首先,打开一个新的project workspace,在File菜单中,选择New建立一个新的Win32 
            Application取名为‘MyDirectX1’,这时在workspace窗口中就会出现了一个新的文件夹。工程创建好后,在Project菜单中选择Add 
            to Project/Files向新的工程中加入程序(这步在后面介绍)。<BR>&nbsp;&nbsp;&nbsp; 
            然后,设置编译时所需包含文件的路径。在Tools菜单中,选择Options,弹出Options对话框,选中Directories 
            ,在Show Directories For列表框中选择Include 
            files,双击列表框底部的空白行,输入C:\DX5SDK\SDK\INC 和 
            C:\DX5SDK\SDK\SAMPLES\MISC;接着再在Show Directories For列表框选择Library 
            files,双击其底部的空白行,输入C:\DX5SDK\SDK\LIB(我们假定DirectX 5 SDK安装在C:\DX5SDK\ 
            )。<BR>&nbsp;&nbsp;&nbsp; 
            最后,设置链接时所需的库文件。打开在Project菜单中Settings/Link,在Category下拉框中选择General,然后在Object/Library模块列表框加入Ddraw.lib和Winmm.lib即可。 
            </P>
            <P>(三)我们的第一个DirectX程序<BR>&nbsp;&nbsp; 我们打算以DirectX 
            SDK所带的例子程序‘DDEX1’作为讲解的基础,因为这样做起码有以下几个好处:(1)大家手里都有正确的源程序,当你辛辛苦苦输完一段程序后,但在编译时不幸出现错误,你就不会不知所措了,可以对照源程序。(2)我也不用再把所有的代码都搬到纸上,这样我们可以更详细的介绍DirectX的重点内容。(3)可以培养你读别人程序的能力,以后学习起来就会更轻松。<BR>&nbsp;&nbsp;&nbsp; 
            既然如此,还等什么呢?还记得我们已经建立了一个新的工程‘MyDirectX1’吗?现在打开Project/Add to 
            Project/Files,浏览目录 
            DXSDK\SDK\SAMPLES\DDEX1,并选择该目录下的所有文件,点击‘OK’就把它们加入到‘MyDirectX1’中了。好了,现在就打开‘DDEX1.CPP’看看吧。</P>
            <P>&nbsp;&nbsp;&nbsp; 1、在使用 
            DirextDraw之前,首先需要创建一个对象DirectDraw的实体,该对象实体代表微机的显示适配器。然后,才能使用接口所提供的方法来操作该对象实体,使之完成有关命令和任务。<BR>&nbsp;&nbsp;&nbsp; 
            所以程序的开头先声明了一个DirectDraw对象:<BR>LPDIRECTDRAW&nbsp;&nbsp;&nbsp; 
            lpDD;<BR>&nbsp;&nbsp;&nbsp; 然后如下创建该对象 :<BR>HRESULT&nbsp; 
            ddrval;<BR>ddrval = DirectDrawCreate( NULL, &amp;lpDD, NULL 
            );<BR>&nbsp;if( ddrval == DD_OK 
            )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp; // DirectDraw 
            对象lpDD创建成功<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp; // 
            DirectDraw对象不能被创建<BR>&nbsp;}</P>
            <P>&nbsp;&nbsp;&nbsp; 
            2、接下来设置协作层的运行方式。即DirectDraw程序的运行方式,指整屏模式、窗口模式、MODEX模式等。<BR>HRESULT&nbsp; 
            ddrval;<BR>ddrval = lpDD-&gt;SetCooperativeLevel( hwnd, 
            DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );<BR>&nbsp;if( ddrval == DD_OK 
            ){<BR>&nbsp; // 全屏独占方式设置成功<BR>&nbsp;&nbsp; 
            }<BR>&nbsp;else&nbsp;{<BR>&nbsp; // 
            设置失败<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            &nbsp;}<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 
            3、设置显示模式,即屏幕分辨率和色彩数。<BR>HRESULT&nbsp; ddrval;<BR>ddrval = 
            lpDD-&gt;SetDisplayMode( 640, 480, 8 );<BR>&nbsp;if( ddrval == DD_OK 
            )&nbsp;{ <BR>&nbsp;// 
            成功的把屏幕设置成了640X480X256色<BR>&nbsp;}<BR>&nbsp;else&nbsp;{<BR>&nbsp; // 
            显示模式不能改变<BR>&nbsp;}</P>
            <P>&nbsp;&nbsp;&nbsp; 
            4、创建表面。我们可以把表面看成是一块内存缓冲区,所有的操作都是对缓冲区进行的,操作完成后只须把整个缓冲区翻转成主表面(显存)即完成了快速写屏。利用这种技术,就可以实现平滑无闪烁的动画效果,下面讲解如何创建表面。<BR>&nbsp;&nbsp;&nbsp; 
            创建可切换式表面(Surface)的第一步是:在DDSURFACEDESC结构中设定表面(Surface)的各项参数,请看下面的程序:</P>
            <P>// Create the primary surface with 1 back buffer.<BR>ddsd.dwSize 
            = sizeof( ddsd );<BR>ddsd.dwFlags = DDSD_CAPS | 
            DDSD_BACKBUFFERCOUNT;<BR>ddsd.ddsCaps.dwCaps = 
            DDSCAPS_PRIMARYSURFACE |<BR>DDSCAPS_FLIP | 
            DDSCAPS_COMPLEX;<BR>ddsd,dwBackBufferCount = 1;</P>
            <P>&nbsp;&nbsp;&nbsp; 
            在以上几行中,DDSURFACEDESC结构的大小被赋给dwSize成员。这样做可防止你在调用DirectDraw的方法时返回一个无效值,且便于今后DDSURFACEDESC结构的扩展。<BR>&nbsp;&nbsp;&nbsp; 
            成员dwFlags用于标明DDSURFACEDESC结构中哪些区域填入的信息有效,哪些区域的信息无效。程序中,我们用dwFlags表明了你要使用结构DDSCAPS(DDSC_CAPS),以及你要创建一个后台缓冲区(DDSD_BACKBUFFERCOUNT)。例程中成员dwCaps包含了一些用在DDSCAPS结构中的标志。这样一来,成员dwCaps就定义了一个主表面(Surface)(DDSCAPS_PRIMARYSURFACE),一个弹出式表面(Surface)(DDS-CPAS_PRIMARYSURFACE),和一个复表面(Surface)(DDSCAPS_COMPLEX)。所谓复表面(Surface)是指,该表面(Surface)是由若干子表面(Surface)组成的。最后,上面的例程定义了一个后台缓冲区。这个后台缓冲区是我们真正进行操作的内存区。操作完成后,再把它们从后台缓冲区弹到主表面(Surface)上就行了。在这里,后台缓冲区的个数被设为1。但你可以设置任意多的后台缓冲区,只要你的内存允许的话。<BR>&nbsp;&nbsp;&nbsp; 
            填完了DDSURFACEDESC结构,就可以使用该结构和lpDD创建表面的指针了:<BR>&nbsp;ddrval = 
            lpDD-&gt;CreateSurface( &amp;ddsd, &amp;lpDDSPrimary, NULL 
            );<BR>&nbsp;if( ddrval == DD_OK ) {<BR>&nbsp; // lpDDSPrimary 
            指向主表面<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            return FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; 
            如果调用成功,则IDirectDraw::CreateSurface函数返回指向主表面的指针lpDDSPrimary 。然后调用 
            IDirectDrawSurface::GetAttachedSurface 
            取得后台缓冲区的指针:<BR>&nbsp;ddscaps.dwCaps = 
            DDSCAPS_BACKBUFFER;<BR>&nbsp;ddrval = 
            lpDDSPrimary-&gt;GetAttachedSurface( &amp;ddcaps, &amp;lpDDSBack 
            );<BR>&nbsp;if( ddrval == DD_OK ) {<BR>&nbsp; // lpDDSBack 
            指向后台缓冲区<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp; return 
            FALSE;<BR>&nbsp;}<BR>&nbsp;&nbsp;&nbsp; 
            如果IDirectDrawSurface::GetAttachedSurface调用成功的话,lpDDSBack 
            就指向后台缓冲区了。现在我们就可以对后台缓冲区进行各种的操作,把想显示的内容写进去。比如游戏,我们就先调入背景图象,然后再调入各种角色当前应显示的图象,最后是‘对白’、‘文字’等。全部完成之后,把后台缓冲区和主表面进行翻转,就把你想要的东西显示出来了。</P>
            <P>&nbsp;&nbsp;&nbsp; 5、翻转表面<BR>&nbsp;while( 1 ) 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            HRESULT 
            ddrval;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ddrval = lpDDSPrimary-&gt;Flip( NULL, 0 
            );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            if( ddrval == DD_OK 
            )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            break; <A 
            href="file://翻/">file://翻/</A>转完成,退出循环<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <A 
            href="file://如/">file://如/</A>果表面丢失了&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;if( 
            ddrval == DDERR_SURFACELOST )&nbsp; <BR>&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp;ddral = LpDDSPrimary-&gt;Restore(); <A 
            href="file://恢/">file://恢/</A>复表面<BR>&nbsp;&nbsp;&nbsp;if( ddral != 
            DD_OK )<BR>&nbsp;&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            break;//恢复成功,退出循环<BR>&nbsp;&nbsp;&nbsp; 
            }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <A 
            href="file://如/">file://如/</A>果前一次表面翻转还未发生<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            if( ddrval != DDERR_WASSTILLDRAWING 
            )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }<BR>&nbsp;&nbsp;&nbsp; 
            例中,lpDDSPrimary指明了主表面及其后台缓冲区。调用IDirectDrawSurface::Flip后,主表面和后台缓冲区交换。如果调用成功,返回DD_OK,程序终止While循环;如果返回DDERR_SURFACELOST,表明可能是表面丢失,需要用IDirectDrawSurface::Restore 
            恢复该表面,若恢复成功,就再一次调用IDirectDrawSurface::Flip方法;如果失败,程序终止While循环并返回一个错误值。另外,即使IDirectDrawSurface::Flip调用成功,交换也不是立即完成,它将等到系统中在此之前的表面交换都完成后才进行。如果前一次的表面翻转还未发生,IDirectDrawSurface::Flip 
            就返回DDERR_WASSTILLDRAWING。IDirectDrawSurface::Flip将继续循环直到返回DD_OK。</P>
            <P>&nbsp;&nbsp;&nbsp; 
            6、结束程序之前别忘了用Release()释放你建立的对象。<BR>&nbsp;&nbsp;&nbsp; if( lpDD != 
            NULL )&nbsp;&nbsp;&nbsp; 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( lpDDSPrimary != 
            NULL )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            lpDDSPrimary-&gt;Release();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            lpDDSPrimary = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            lpDD-&gt;Release();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            lpDD = NULL;</P>
            <P>&nbsp;&nbsp;&nbsp; 
            OK!大功告成。运用以上的手段我们就可以作出基本的DirectX程序了,不过不要高兴的太早,DirectX远比你想象的要庞大的多!我们所涉及的不过是一点皮毛而已(仅包括了DirectDraw),要想全面掌握DirectX编程的技巧,你还须付出艰辛的努力。我的建议是多上机,多看书,多读读别人的程序,只有这样才能快速提高自己的水平。<BR>&nbsp;&nbsp;&nbsp; 
            好了,今天我们就先聊到这里,希望这能对你有所帮助,如果有机会的话,我想我们还会见面的。当然,你也可以写信到这里 <A 
            href="mailto:wj77@990.net">wj77@990.net</A>,大家交个朋友嘛!下次见啦!</P>
            <P><BR>成都电子科技大学 95080-5 汪疆 (610054)<BR>&nbsp;&nbsp;&nbsp; </P>
            <P>&nbsp;</P><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0 
width=770>
  <TBODY>
  <TR bgColor=#006699>
    <TD align=middle bgColor=#006699 id=white><FONT 
    color=#ffffff>对该文的评论</FONT></TD>
    <TD align=middle>
      <SCRIPT 
      src="CSDN_文档中心_DirectX编程技术 --- 想学游戏编程吗必读.files/readnum.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_DirectX编程技术 --- 想学游戏编程吗必读.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; right <I>(2001-11-7 
      23:23:32)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>不叫编游戏必读!! 
<BR></TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TH bgColor=#006699 id=white><FONT 
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
  <TBODY>
  <TR>
    <TD>你没有登陆,无法发表评论。 请先<A 
      href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=3407">登陆</A> 
      <A 
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>

<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
  <TBODY>
  <TR align=middle>
    <TD height=10 vAlign=bottom><A 
      href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A 
      href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A 
      href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A 
      href="http://www.csdn.net/english">English</A> </TD>
    <TD align=middle rowSpan=3><A 
      href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG 
      border=0 height=48 
      src="CSDN_文档中心_DirectX编程技术 --- 想学游戏编程吗必读.files/biaoshi.gif" 
    width=40></A></TD></TR>
  <TR align=middle>
    <TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
  <TR align=middle>
    <TD vAlign=top><FONT face=Verdana>Copyright &copy; CSDN.net, Inc. All rights 
      reserved</FONT></TD></TR>
  <TR>
    <TD height=15></TD>
    <TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>

⌨️ 快捷键说明

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