DirectX编程技术 --- 想学游戏编程吗?必读

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

DirectX编程技术

    大家对DirectX一定不陌生吧,因为在微软刚刚推出WINDOWS窗口操作系统时,由于显示界面采用统一的GDI,禁止程序员直接操作硬件,这使得在WIN 3.x系统上的游戏程序速度奇慢,根本无法推广。微软为了解决这一问题,曾经又推出过WING图形加速程序,但是由于WING缺乏广大游戏厂商的支持,也没有普及开来。所以我们当时玩的大部分游戏都是运行于DOS环境之下。
    直到1995年,伴随着WINDOWS 95的诞生,微软公司正式公布了其新一代的游戏开发系统DirectX。DirectX以其高效的性能,统一的程序接口,使得其一推出便受到了各大游戏厂家的喜爱,并纷纷表示支持它,至此WINDOWS系统下的游戏开发时代才真正开始。
    DirectX编程,将涉及到 WIN 95 和 C++ 的一些基本知识,所以在此之前您最好有这方面的基础,如果您不是很熟悉他们的话也不要紧,完全可以随着本文介绍一起学习,可谓一箭双雕。

    好了,闲话少说开始进入正题:
(一)DirectX由以下几个部分组成:
    1、DirectDraw:通过直接访问显示内存和软硬件加速技术,实现快速直接存取。
    2、DirectSound:提供软硬件声音混合和录音再生功能。
    3、DirectPlay :提供多人游戏的交互功能,让您轻松实现网上互连。
    4、Direct3D:交互式的三维图形技术。
    5、DirectInput:使你的程序能够控制输入设备如鼠标,键盘,和游戏杆等。
    6、DirectSetup:完成DirectX驱动程序的安装。
    7、AutoPlay:只要您把光碟一放入光驱它便会自动运行。
   最后补充一句,我们讲到和用到的都是DirectX 5的东西,所以需要一套DirectX 5 SDK,你可以在时下一些光盘中找找,它是免费的。

(二)正式编程之前的准备工作
    要让VC++ 5能正确的编译、链接你的程序,你必须先在Microsoft Developer Studio中进行如下设置,以使得编译器能够找到需要的链接库和包含文件。
    首先,打开一个新的project workspace,在File菜单中,选择New建立一个新的Win32 Application取名为‘MyDirectX1’,这时在workspace窗口中就会出现了一个新的文件夹。工程创建好后,在Project菜单中选择Add to Project/Files向新的工程中加入程序(这步在后面介绍)。
    然后,设置编译时所需包含文件的路径。在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/ )。
    最后,设置链接时所需的库文件。打开在Project菜单中Settings/Link,在Category下拉框中选择General,然后在Object/Library模块列表框加入Ddraw.lib和Winmm.lib即可。

(三)我们的第一个DirectX程序
   我们打算以DirectX SDK所带的例子程序‘DDEX1’作为讲解的基础,因为这样做起码有以下几个好处:(1)大家手里都有正确的源程序,当你辛辛苦苦输完一段程序后,但在编译时不幸出现错误,你就不会不知所措了,可以对照源程序。(2)我也不用再把所有的代码都搬到纸上,这样我们可以更详细的介绍DirectX的重点内容。(3)可以培养你读别人程序的能力,以后学习起来就会更轻松。
    既然如此,还等什么呢?还记得我们已经建立了一个新的工程‘MyDirectX1’吗?现在打开Project/Add to Project/Files,浏览目录 DXSDK/SDK/SAMPLES/DDEX1,并选择该目录下的所有文件,点击‘OK’就把它们加入到‘MyDirectX1’中了。好了,现在就打开‘DDEX1.CPP’看看吧。

    1、在使用 DirextDraw之前,首先需要创建一个对象DirectDraw的实体,该对象实体代表微机的显示适配器。然后,才能使用接口所提供的方法来操作该对象实体,使之完成有关命令和任务。
    所以程序的开头先声明了一个DirectDraw对象:
LPDIRECTDRAW    lpDD;
    然后如下创建该对象 :
HRESULT  ddrval;
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
 if( ddrval == DD_OK )
       {
  // DirectDraw 对象lpDD创建成功
 }
 else
 {
  // DirectDraw对象不能被创建
 }

    2、接下来设置协作层的运行方式。即DirectDraw程序的运行方式,指整屏模式、窗口模式、MODEX模式等。
HRESULT  ddrval;
ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
 if( ddrval == DD_OK ){
  // 全屏独占方式设置成功
   }
 else {
  // 设置失败
        }
   
    3、设置显示模式,即屏幕分辨率和色彩数。
HRESULT  ddrval;
ddrval = lpDD->SetDisplayMode( 640, 480, 8 );
 if( ddrval == DD_OK ) {
 // 成功的把屏幕设置成了640X480X256色
 }
 else {
  // 显示模式不能改变
 }

    4、创建表面。我们可以把表面看成是一块内存缓冲区,所有的操作都是对缓冲区进行的,操作完成后只须把整个缓冲区翻转成主表面(显存)即完成了快速写屏。利用这种技术,就可以实现平滑无闪烁的动画效果,下面讲解如何创建表面。
    创建可切换式表面(Surface)的第一步是:在DDSURFACEDESC结构中设定表面(Surface)的各项参数,请看下面的程序:

// Create the primary surface with 1 back buffer.
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd,dwBackBufferCount = 1;

    在以上几行中,DDSURFACEDESC结构的大小被赋给dwSize成员。这样做可防止你在调用DirectDraw的方法时返回一个无效值,且便于今后DDSURFACEDESC结构的扩展。
    成员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。但你可以设置任意多的后台缓冲区,只要你的内存允许的话。
    填完了DDSURFACEDESC结构,就可以使用该结构和lpDD创建表面的指针了:
 ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
 if( ddrval == DD_OK ) {
  // lpDDSPrimary 指向主表面
 }
 else{
      return FALSE;
     }
    如果调用成功,则IDirectDraw::CreateSurface函数返回指向主表面的指针lpDDSPrimary 。然后调用 IDirectDrawSurface::GetAttachedSurface 取得后台缓冲区的指针:
 ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
 ddrval = lpDDSPrimary->GetAttachedSurface( &ddcaps, &lpDDSBack );
 if( ddrval == DD_OK ) {
  // lpDDSBack 指向后台缓冲区
 }
 else{
  return FALSE;
 }
    如果IDirectDrawSurface::GetAttachedSurface调用成功的话,lpDDSBack 就指向后台缓冲区了。现在我们就可以对后台缓冲区进行各种的操作,把想显示的内容写进去。比如游戏,我们就先调入背景图象,然后再调入各种角色当前应显示的图象,最后是‘对白’、‘文字’等。全部完成之后,把后台缓冲区和主表面进行翻转,就把你想要的东西显示出来了。

    5、翻转表面
 while( 1 ) {
            HRESULT ddrval;
            ddrval = lpDDSPrimary->Flip( NULL, 0 );
            if( ddrval == DD_OK )            
  {
                break; file://翻转完成,退出循环
            }
            file://如果表面丢失了   
  if( ddrval == DDERR_SURFACELOST ) 
   {
   ddral = LpDDSPrimary->Restore(); file://恢复表面
   if( ddral != DD_OK )
    {
       break;//恢复成功,退出循环
    }
               }
            file://如果前一次表面翻转还未发生
            if( ddrval != DDERR_WASSTILLDRAWING )
            {
                break;
       }
        }
    例中,lpDDSPrimary指明了主表面及其后台缓冲区。调用IDirectDrawSurface::Flip后,主表面和后台缓冲区交换。如果调用成功,返回DD_OK,程序终止While循环;如果返回DDERR_SURFACELOST,表明可能是表面丢失,需要用IDirectDrawSurface::Restore 恢复该表面,若恢复成功,就再一次调用IDirectDrawSurface::Flip方法;如果失败,程序终止While循环并返回一个错误值。另外,即使IDirectDrawSurface::Flip调用成功,交换也不是立即完成,它将等到系统中在此之前的表面交换都完成后才进行。如果前一次的表面翻转还未发生,IDirectDrawSurface::Flip 就返回DDERR_WASSTILLDRAWING。IDirectDrawSurface::Flip将继续循环直到返回DD_OK。

    6、结束程序之前别忘了用Release()释放你建立的对象。
    if( lpDD != NULL )   
        {
        if( lpDDSPrimary != NULL )        {
            lpDDSPrimary->Release();
            lpDDSPrimary = NULL;
        }
        lpDD->Release();
        lpDD = NULL;

    OK!大功告成。运用以上的手段我们就可以作出基本的DirectX程序了,不过不要高兴的太早,DirectX远比你想象的要庞大的多!我们所涉及的不过是一点皮毛而已(仅包括了DirectDraw),要想全面掌握DirectX编程的技巧,你还须付出艰辛的努力。我的建议是多上机,多看书,多读读别人的程序,只有这样才能快速提高自己的水平。
    好了,今天我们就先聊到这里,希望这能对你有所帮助,如果有机会的话,我想我们还会见面的。当然,你也可以写信到这里 wj77@990.net,大家交个朋友嘛!下次见啦!


成都电子科技大学 95080-5 汪疆 (610054)
   

 

directx游戏开发终极指南 directx游戏编程教程 很多游戏引擎最后都是要调用Directx和Opengl。也就是说游戏引擎只是对Directx等底层API的一种包装,方便使用,当然也提供了很多游戏编程里可能会用到的强大功能。 写游戏基本上是不得不使用引擎的,因为你没有必要从头造轮子,除非你打算显示一个图片就要手打上百行代码,或者只是做一个超简单的游戏做练习。 如果你会dx 懂底层再学习游戏引擎会更容易理解它的原理 用着更顺手,甚至自己写一个小引擎... 阅读详情

相关推荐

DirectX 游戏编程游戏框架

按照之前两篇文章将书写DirectX游戏框架代码 DirectX 游戏编程之开篇 DirectX 游戏编程之3D空间,顶点缓存及索引缓存 开发环境:vs2012, DirectX SDK (June 2010),C++

LDLAN 1427

DirectX编程

3D游戏入门编程,很经典的一本书 一起学习和精通,愿大家都变成大神

DirectX5.0最新游戏编程指南 DirectDraw教程篇 一、配置DirectX SDK

 DirectX5.0最新游戏编程指南DirectDraw教程篇    DirectX是为Visual C++的用户准备的,因此要编制DirectDraw游戏程序,最好对VC要有一定的了解。不愿意使用VC的用户也可以利用消息Arakelian Soft公司开发的专门针对Visual Basic5.0用户的ActiveX控件DirectStudio98或Tegosoft公司的TegoSoft A

holyfire的专栏 4144

Direct 11 游戏编程入门

Direct11 游戏编程中文版pdf,无解压密码。

DirectX12 简单入门(一)

在很久以前写过关于DirectX9的一些应用,直到现在DirectX12已经普及了。写完几个DirectX12测试代码之后,写一篇DirectX12简单入门介绍一下基本概念,以及环境搭建和编程过程。

wupeng4389151的博客 2023

DirectX游戏编程入门——第一部分(WindowsDirectX游戏编程引言) —— 初识DirectX

本系列文章由 net_assassin 编写,转载请注明出处。           http://blog.csdn.net/net_assassin/article/category/1100363       作者:net_assassin    邮箱: net_assassin@hotmail.com    期待着与志同道合的朋友们相互交流        ...

p312011150的博客 5633

全面掌握DirectX编程:从D3D基础到高级应用.zip

本文还有配套的精品资源,点击获取 简介:DirectX是一组用于计算机图形学任务的API,尤其在游戏开发中十分关键。D3Dwindows.zip压缩包包含了Direct3D相关的资源,专注于3D图形渲染。本资源包涵盖了Direct3D编程的基础框架,包括设备创建、窗口创建、交换链、状态设置、顶点和索引缓冲、视图和投影矩阵、渲染循环、资源管理、着色器编程和事件处理。提供了一个...

weixin_35266799的博客 1398

DirectX12(D3D12)基础教程(一)——基础教程

目录 1、前言 2、调用D3D12的基本步骤和准备工作 3、包含头文件和引用库文件 4、定义待渲染3D数据结构 5、定义变量 6、创建窗口 7、创建DXGI 8、创建D3D2设备对象接口 9、创建D3D2命令队列接口 10、创建交换链 11、创建RTV描述符堆和RTV描述符 12、创建根签名对象接口 13、编译Shader及创建渲染管线状态对象接口 14、加载待渲...

Gamebaby Rock Sun的博客 10万+

DirectX编程技术 --- 想学游戏编程?必读

 大家对DirectX一定不陌生吧,因为在微软刚刚推出WINDOWS窗口操作系统时,由于显示界面采用统一的GDI,禁止程序员直接操作硬件,这使得在WIN 3.x系统上的游戏程序速度奇慢,根本无法推广。微软为了解决这一问题,曾经又推出过WING图形加速程序,但是由于WING缺乏广大游戏厂商的支持,也没有普及开来。所以我们当时玩的大部分游戏都是运行于DOS环境之下。    直到1995年,伴随着WIN

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 743

DirectX编程技术 --- 想学游戏编程?必读 (转)

DirectX编程技术 --- 想学游戏编程?必读 (转)[@more@]DirectX编程技术 大家对DirectX一定不陌生吧,因为在微软刚刚推出windows窗口操作系统时,由于显示界面采用统一的GDI,禁止程序员...

csd3176的博客 186

c# DirectX DirectInput 游戏手柄 游戏摇杆 编程

采用微软DirectX的DirectInput编程,控制游戏手柄,游戏摇杆 项目想要用游戏摇杆控制无人车,用莱仕达的雷霆PRO做实验。 源码用VS2015写的,winform程序。 摇杆实物图: 软件界面: 部分代码: 查找设备 public string FindJoysticks() { systemJoysticks = null; try { // Find

sinat_41346277的博客 3439

DirectX11编程1 游戏循环框架的搭建

环境:VS2017  语言:C++   总起: 本次的博文主要参考红龙书(《Introduction to 3D Game Programming with Directx 11》)和X_Jun96大佬将DirectX SDK移植到最新的Windows SDK的博文:https://blog.csdn.net/x_jun96/article/details/80293670。   之前的...

暗光之痕的博客 1833

【Visual C++】游戏开发笔记二十四 由DirectX的几个版本说开去

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。http://blog.csdn.net/zhmxy555/article/details/7629288作者:毛星云    邮箱: happylifemxy@qq.com    期待着与志同道合的朋友们相互交流本节是DirectX 11的一个开篇,都是些概念性的知识,希望在正式学习DirectX 11之前,对将要学习的内容有一个整体的认

【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 2万+

[转]DirectX编程技术

大家对DirectX一定不陌生吧,因为在微软刚刚推出WINDOWS窗口操作系统时,由于显示界面采用统一的GDI,禁止程序员直接操作硬件,这使得在WIN3.x系统上的游戏程序速度奇慢,根本无法推广。微软为了解决这一问题,曾经又推出过WING图形加速程序,但是由于WING缺乏广大游戏厂商的支持,也没有普及开来。所以我们当时玩的大部分游戏都是运行于DOS环境之下。 直到1995年,伴随着

轩辕之子Hui的专栏 517

DirectX 3D游戏编程全教程+源代码

DirectX是一个微软的程序接口集合,它允许软件与硬件通信,主要用于开发Windows平台的多媒体应用程序。从最初的DirectDraw和Direct3D开始,DirectX已经发展成为一个庞大的技术集合,包括DirectMusic、DirectPlay、DirectInput等。其中,Direct3D是DirectX的核心组件,专用于3D图形渲染。Direct3D的渲染流程包括初始化设备、创建资源、设置渲染状态、绘制几何体和交换表面。

weixin_31749299的博客 1190

DirectX 11游戏编程新手实战教程

DirectX 11作为微软推出的游戏和多媒体编程接口,其API版本在游戏开发领域占有重要地位。它旨在为开发者提供一系列工具和功能,以实现更加复杂和逼真的图形渲染效果。DirectX 11引入了新的渲染技术,如计算着色器和细分着色器,并为多线程渲染优化提供了原生支持。HLSL(High-Level Shading Language)是一种用于编写着色器程序的高级语言,它提供了用于GPU编程的强大功能。HLSL语法类似于C语言,但是它包含了许多专门用于图形和渲染的特性。

weixin_42584586的博客 1291

DirectX 12进行3D游戏编程入门「1」——初始化

初始化 DirectX 12 管道(pipeline) 创建设备(device) 创建命令队列、命令列表分配器和命令列表 创建命令队列 创建命令列表分配器 创建命令列表 创建交换链(swap chain) 初始化 Assets 创建描述符堆(descriptor heap) 创建渲染对象视图 创建viewport 创建scissor 创建着色器(shader) 创建顶点着色器(vert...

小明伽利略的专栏 4305

DirectX 11游戏编程学习笔记之1: 开场白

本文由哈利_蜘蛛侠原创,转载请注明出处!有问题欢迎联系2024958085@qq.com           这是我之前的博客系列“DirectX9.0c游戏开发手记之‘龙书’第二版学习笔记”的平行版,也可以说是续集。说是平行版,因为这两个博客系列因为某种显而易见的原因,内容是很平行的;而之所以说是续集,是因为前面那个系列可能就此坑掉了……         前面那个系列是关于“龙书”第二版的

哈利_蜘蛛侠的专栏 4485
上一篇: WIN2000漏洞(2) —— 绿色兵团的文章,简直爽呆了
下一篇: DirectDraw6的初级编程应用 —— 配合实例讲解,让你迅速入门
silver
博客等级 码龄26年 117粉丝 2073原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值