2022年游戏开发基础 2.pdf

上传人:H****o 文档编号:39890887 上传时间:2022-09-08 格式:PDF 页数:8 大小:71.76KB
返回 下载 相关 举报
2022年游戏开发基础 2.pdf_第1页
第1页 / 共8页
2022年游戏开发基础 2.pdf_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《2022年游戏开发基础 2.pdf》由会员分享,可在线阅读,更多相关《2022年游戏开发基础 2.pdf(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、游戏开发基础(3)第三章DirectX SDK简介第一节关于 DirectX SDKMicrosoft DirectX提供了一套非常优秀的应用程序接口,包含了设计高性能、实时应用程序的源代码。DirectX 技术将帮助您建构下一代的电脑游戏和多媒体应用程序。它的内容包括了DirectDraw、DirectSound、DirectPlay、Direct3D和 DirectInput等部分,它们分别主要应用在图形程序、声音程序等方面。由于 DirectX,使在 Windows下运行应用程序的性能可以与在DOS 或游戏平台下运行的应用程序性能相媲美,甚至超过它们。它将为您的Windows游戏开发提供

2、一个具有鲁棒性的、标准化的操作环境。DirectX 包括两部分:运行期部分(Runtime)和 SDK。在 DirectX 开发时,这两部分都要用到,但在DirectX 应用程序运行时只用运行期部分。在Windows NT 4.0及以上版本中含有DirectX 运行期部分,Win95 则没有。但 Win95 可以很容易获得DirectX 运行期部分。而Windows NT 4.0以前的版本不能运行DirectX 程序。许多基于 DirectX 的应用程序和游戏都包含了DirectX 运行期部分。它目前有五个版本:1、2、3、5 和 6(没有版本4)。不同版本具有不同的运行期部分,但新版本的运行

3、期部分可与旧版本的应用程序配合,即向上兼容。当前大部分流行的游戏都是基于版本5 开发的。第二节DirectX5 SDK的获得DirectX SDK 包括开发DirectX 应用程序所需要到的全部示例和帮助文件,但这些都是可选资源,必须的文件是头文件(.h 文件)和库文件(.lib 文件)。获得DirectX SDK比获得运行期部分要困难一些。Windows NT 4.0和 Win95 都不带 DirectX SDK,要获得 SDK 可通过以下3 种办法:*购买 Visual c+5.0(包括 DirectX SDK)*访问 Microsoft Web站点的 DirectX 下载页*成为 MSD

4、N(Microsoft开发网络)用户SDK 也可以从Microsoft Web站点上获得,下载量很大,尤其是在拨号连接时,有可能需要一整夜的时间。成为 MSDN 用户是获取SDK 的好办法,除非您反对通过Microsoft付费的方式获得升级及其操作系统的程序开发特权。SDK 由 MSDN level 2及以上提供。第三节元件对象模型(COM)DirectX 根据 Microsoft的 COM(Component Object Model,即元件对象模型)规格得以实现。COM 设计成用来提供完全便携的、安全的、可升级的软件结构。COM使用一个面向对象的模型,这要比像C+等语言所用的模型更严格。例

5、如,COM对象经常通过成员函数进行存取,而且并不具备公共数据成员。COM 对继承性的支持与 C+相比也是有限的。很多 DirectX 中 API 是作为 COM 对象的实例来创建的。您可以这样看:对象就象一个黑盒子,它代表了硬件,从而需要通过一个接口与应用程序进行联络。通过名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 8 页 -COM 接口发送和接收的命令被称为“方式(method)”。例如,方式IDirectDraw2:GetDisplayMode是通过接口IDirectDraw2发送,从而能够从DirectDraw对象得到当前显示适配器的显示模式。COM 对象提供实际函数性

6、,而COM 接口则提供存取函数性的方法。COM 对象不能被直接存取,相反,所有的存取者通过接口来完成。这条规则是如此强有力的得到遵守,以致于我们不能给任何COM 对象以名称。我们只能给用来存取对象的接口名称。所有的 COM 接口都是从IUnknown接口中衍生出来的。“I”标志经常用于命名COM接口(它代表 Interface即接口)。IUnknown接口提供 3 个成员函数,所有COM 接口因而继承这些函数:AddRef():使对象内部引用值加一。例如,当您创建一个新的接口时,构造函数将自动调用AddRef()。QueryInterface():让 COM 对象就它们是否支持特定接口进行查询

7、。例如,升级的 COM 对象提供附加的接口,而非现有接口的修改版。QueryInterface()函数可以用来确定旧的接口,以决定新的接口是否被支持。如果被查询的对象不支持有问题的接口,则更替接口的指针就返回。Release():使对象内部引用值减一。您应该在接口的指针将要超出范围时或者要通过使用接口指针来结束时使用这个函数。对象的每一个DirectX 接口都代表了一种设备,例如IDirectDraw2、IDirectSound和 IDirectPlay。DirectX 对象模型象征性地为每一个设备提供了一个主对象,其它所支持的功能对象由主对象衍生而来。例如,DirectDraw对象代表了显示

8、适配器,您可以由它创建DirectDrawSurface对象来代表显存。同样地,DirectSound对象代表声卡并可以创建DirectSoundBuffer对象代表声卡上的声音资料。在 C 程序中可以调用任意的COM 接口方式。下面的例子创建一个平面,使用DirectDraw对象的 IDirectDraw2:CreateSurface方式:ret=lpDD-lpVtbl-CreateSurface(lpDD,&ddsd,&lpDDS,NULL);这里 lpDD 表示与新建平面相关的DirectDraw对象。该方式填充一个平面类型的结构(&ddsd)并返回一个指向平面的指针(&lpDDS)。同

9、样功能用C+的实现为:ret=lpDD-CreateSurface(&ddsd,&lpDDS,NULL)第四节DirectDrawDirectDraw是 DirectX SDK 中的一个组件,它允许用户直接地操作显存,支持硬件覆盖、内存与显存反转。DirectDraw在提供这些功能的同时并支持基于Microsoft Windows 的应用程序和设备驱动。DirectDraw作为一种软件接口,支持Windows的 GDI(图像设备接口),并提供直接操作显示设备的功能。它提供了与设备无关的游戏、Windows子系统等软件开发方式。它还能够支持许多种显示硬件,包括从简单的SVGA 显示器到高级硬件性

10、能(支持图像剪切、延伸和非RGB 颜色格式)。接口的设计使您的应用程序能够知道所使用硬件的特性,从而可以支持它们的硬件加速功能。关于 DirectDraw,在以后还将有更加详细的讲解。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 8 页 -第五节DirectSoundMicrosoft DirectSound的 API 是 DirectX 平台软件开发工具(SDK)程序员指南的声音组件。DirectSound提供了硬件加速、对声音设备的直接操作。在提供这些功能的同时,它还保持了与当前设备驱动的兼容性。新版本的 DirectSound能够在运行中查询硬件性能以确定最优的操作方式,

11、还具有抓获声音、低延迟混音等功能特性。它的新功能还包括支持属性集(Porperty Sets),从而即使 DirectSound不直接支持新硬件的特性,它也能够利用并受益。DirectSound是通过“硬件抽象层(HAL)”来操作声音硬件的,这是一个由声音设备驱动来实现的接口。HAL 提供了以下功能:要求和释放对声音硬件的控制;描述声音硬件的特性;在硬件允许的条件下实现特定的操作;在硬件不允许的时候报告操作失败。DirectSound能够自动地利用硬件加速,包括硬件混音和硬件声音缓冲。您的应用程序无须查询硬件和程序特性,而可以在运行期部分查询DirectSound来获得对声音设备特性的充分描述

12、,然后根据各个特性的存在或缺少来使用不同的方法进行优化。您还可以指定接受硬件加速的声音缓冲区。下图显示了DirectSound与系统中其它声音组件的关系:关于 DirectSound,在以后还将有更加详细的讲解。第六节DirectPlayDirectPlay 的主要作用在于使应用程序间通讯方式得以简单化。DirectPlay的技术不仅提供了一个方案,实现了通讯与传送协议及在线服务的无关性,而且还实现了与传输服务器和游戏服务器的无关性。万一所基于的网络不支持某一方式,DirectPlay 包含了必要的代码来仿效它。DirectPlay 的 service provider结构使应用程序与网络隔绝

13、开来。应用程序通过查询 DirectPlay来获得所基于网络功能特性(例如延迟、带宽等),从而相应地调整通讯方式。下面的图显示了DirectPlay service provider的结构:使用 DirectPlay的第一步是选择使用哪一种service provider,它决定了将用于通讯的网络或协议。协议可以是遍布Internet的 TCP/IP、局域网中的IPX 或两台计算机间的连接电缆。DirectPlay 提供了两种很有用的连接管理方式:IDirectPlay3:EnumConnections列举了应用程序可以获得的所有连接;IDirectPlay3:InitializeConnec

14、tion初始化一种特定的连接。在确定了网络的连接后,为了方便理解下面的内容,先来看看这样几个概念:首先从 session 讲起。DirectPlay session是若干台计算机之间的通讯通道。一个应用程序只有在成为了某个session 的一部分后才能够开始与其它计算机进行通讯。有两种方法可以实现:列举一个网络中所有存在的session 然后加入其中的一个;或新建一个session 并等待其它计算机的加入。当应用程序成为session 的一部分后,它就可以创建一个player 并与 session 中其它的player 相互传递信息。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共

15、 8 页 -每一个 session 中都有一台计算机作为主机。主机是session 的所有者并拥有唯一的改动 session 属性的权力。下图显示了一个session 模型:Session 有两种类型:对等类型和客户/服务器类型。Player 是 session 中逻辑概念上的对象,能够发送和接收消息。在 DirectPlay Session中没有对实体计算机的表示方法。Player 可以作为一个本地player(在您自己的计算机上),或作为一个远程player(在其它计算机上)。只有在拥有了至少一个player 后,计算机才能够发送和接收消息。每一台计算机可以拥有不止一个本地player。G

16、roup 是在逻辑概念上是一些player 的集合。通过创建一个group,一个应用程序可以向它发送消息使其中所有的player 都收到。DirectPlay 提供了管理group 和成员关系的方式。下图显示了一个session 内容的逻辑结构:假如,一台计算机在完成了连接之后,就可以调用IDirectPlay3:EnumSessions列举所有可以得到的session。然后,IDirectPlay3:Open根据 session cache中的内容加入一个session,或新建一个session。接下来,可以创建 player 和 group。而在游戏中,更多的是通过Message Mana

17、gment中的各个方式进行频繁地、大量的消息传送。在不同类型的session 中,消息的流向是不同的。在对等类型中,消息的传送是各个 player 之间直接进行的。对于使用multicast向 group中传送消息时,则要在group 中指定一个multicast server,通过它再将消息传送给group 中其它的计算机。在客户/服务器类型的session 中,所有的player 只与服务器进行直接通讯,再由它与其它各个客户机进行消息传送。下图表示了这样的关系:第七节DirectInputDirectInput用以支持包括鼠标、键盘和游戏杆等在内的输入设备,甚至还有力度反馈的高级输入/输出

18、设备。它也是基于COM 的。DirectInput对象由输入设备提供数据。每一个相应设备都有所谓“对象实例”,即个别的控件,如按键、按纽和游戏杆的轴向等。键盘上的每一个按键都可以作为键盘对象的一个对象实例。即使程序在后台运行,DirectInput也能够对输入设备做出响应。一般来说,先要创建一个DirectInput对象(通过DirectInputCreat方式),表示一个 DirectInput子系统。然后,列举出系统中可以得到的输入设备,再为这些个别设备创建DirectInputDevice对象(通过IDirectInput:CreateDevice方式)。这种对象的方式用于获取关于设备的

19、信息,设置它们的属性并从它们那里得到数据。下面给出一个使用鼠标的例子。您可以在光盘Example 目录下的Scrawl.c 文件中找到这些代码。首先创建 DirectInput鼠标设备/LPDIRECTINPUT g_pdi;/已被初始化名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 8 页 -LPDIRECTINPUTDEVICE g_pMouse;HRESULT hr;hr=g_pdi-CreateDevice(GUID_SysMouse,&g_pMouse,NULL);if(FAILED(hr)Complain(hwnd,hr,CreateDevice(SysMouse);

20、return FALSE;CreateDevice方式有三个参数:第一个是全局独有标志符GUID_SysMouse,这里表明为鼠标;第二个是IDirectInputDevice接口指针类型,如果这个调用成功,它就指向可用的鼠标;一般不使用COM 聚合体,第三个参数为NULL。然后,设置鼠标信息的格式:hr=g_pMouse-SetDataFormat(&c_dfDIMouse);if(FAILED(hr)Complain(hwnd,hr,SetDataFormat(SysMouse,dfDIMouse);return FALSE;设置鼠标行为:hr=g_pMouse-SetCooperativ

21、eLevel(hwnd,DISCL_EXCLUSIVE|DISCL_FOREGROUND);/后面的两个标志符实现了前台运行时对输入设备的独占if(FAILED(hr)Complain(hwnd,hr,SetCooperativeLevel(SysMouse);return FALSE;要使用事件通告(event notification)来发觉鼠标的动作并将经过缓冲的鼠标输入读进来,这都需要进行一些设置。首先,创建一个事件,将它与鼠标联系起来。当发生硬件中断时,就可以告诉鼠标设备对象有新的数据来到。/HANDLE g_hevtMouse;/全局变量g_hevtMouse=CreateEven

22、t(0,0,0,0);if(g_hevtMouse=NULL)Complain(hwnd,GetLastError(),CreateEvent);return FALSE;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 8 页 -hr=g_pMouse-SetEventNotification(g_hevtMouse);if(FAILED(hr)Complain(hwnd,hr,SetEventNotification(SysMouse);return FALSE;现在您需要设定缓冲区大小。在此之前要初始化一个DIPROPDWORD 结构,这当中很多数量是无关紧要的,关键是最后一

23、个,dwData,它决定了缓冲区中可容纳项目的数量。#define DINPUT_BUFFERSIZE 16 DIPROPDWORD dipdw=/the header sizeof(DIPROPDWORD),/diph.dwSize sizeof(DIPROPHEADER),/diph.dwHeaderSize 0,/diph.dwObj DIPH_DEVICE,/diph.dwHow ,/the data DINPUT_BUFFERSIZE,/dwData;接着按照您希望改变的属性的标志符,将头地址传送给IDirectInputDevice:SetProperty方式:hr=g_pMous

24、e-SetProperty(DIPROP_BUFFERSIZE,&dipdw.diph);if(FAILED(hr)Complain(hwnd,hr,Set buffer size(SysMouse);return FALSE;至此,设置结束。然后开始根据程序的要求操作鼠标。第八节Direct3DDirect3D 提供了与硬件无关的的3D 视频硬件操作方式。您可以在两种模式(立即模式和保留模式)中选择其中之一使用。立即模式较保留模式是一个低层的3D API,后者建构于前者之上。立即模式适合于开发高品质的多媒体应用程序,它在底层与加速硬件进行通讯。保留模式应用于名师资料总结-精品资料欢迎下载-名

25、师精心整理-第 6 页,共 8 页 -对 3D 场景进行实时的操纵。对 3D 场景的操作是基于矩阵和多边形的运算,这是创建和管理3D 的基础知识,在很多资料中均可获得。使用立即模式可以选择通过调用DrawPrimitive方式或利用执行缓冲区。对于初学者一般从调用DrawPrimitive方式。不过,千万不要认为两者有优劣之分。在熟悉了 Direct3D 后,使用哪个方法取决于您应用程序的要求。前者的方法与其它COM雷同;在利用执行缓冲区的方法时,要创建DirectDraw和 Direct3D 对象,设置渲染状态,填充执行缓冲区等。无论哪种模式,应用程序与硬件的通讯都很类似。正如下图所示。由于

26、Direct3D相当于 DirectDraw对象的一个接口,这里的HAL 被表示为DirectDraw/Direct3D HAL。对保留模式的操作是通过使用一些对象来实现的。Direct3D 和 DirectDraw是紧密联系在一起的。一个DirectDraw对象将 DirectDraw和 Direct3D 状态封装起来,通过 IDirectDraw:QueryInterface方式将 IDirect3D接口转换为DirectDraw对象。有一个很重要的概念是z 缓冲区。它决定了将很多显示内容如何覆盖和裁剪。如果没有 z 缓冲区,保留模式无法给覆盖层排序。没有指定z 顺序的覆盖层被缺省设定为

27、0,处于最底层。一共可以有四十亿个覆盖层(应该够用了吧!),z 顺序为 2的层将可能遮掩了z 顺序为 1 的层的某些内容。记住,不能有两个层的z 顺序相同。关于 3D 场景,还有诸如材资、光源等概念,在此不再一一聱述。第九节Vc+中引入 Direct SDK一旦安装了SDK,就得马上通知Visual C+SDK的位置。默认状态下,SDK 安装在 dxsdk 目录下。头文件放在dxsdk/inc目录下,库文件放在dxsdk/lib目录下。可利用下述两种方法之一通知visual C+SDK的位置。一种方法是在使用文件时给出完整的文件路径;另一种法是将这些目录加到Visual C+的搜索路径中。第二

28、种方法更好一些,可以通过ToolsOptionsDirectories对话框实现。增加 dxsdk/lib目录的方法大体上同增加dxsdk/inc目录的方法相同。如果你获得了一个含有比Visual C+的 DirectX SDK 新的版本,您需要将DirectX SDK 目录置于常规的Visual C+目录上面。否则就得使用旧版本。(Visual C+从上至下查找目录)根据我们已经讨论过的内容,你应该能够编辑DirectX 程序了。然而还有最后一个潜在的障碍。除非INITGUID符号已经被定义,否则在DirectX GUIDs下调用Query-Interface()函数的程序同DirectX2 SDK 的链接会失败。INITGUID符号只能由一个源文件定义,并且必须出现在#include语句之前,如下列代码所示:#define INITGUID#include ddraw.h/other includes对于 DirectX3 及以上版本,这种解决方法都是有效的,但还有一个更好的方法,名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 8 页 -即将 dxguid.lib文件链接到你的工程上(BuildSettingsLink对话框),以替代INITGUID符号的定义。名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 8 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com