收藏 分享(赏)

游戏开发基础(3)new.doc

上传人:dzzj200808 文档编号:2528108 上传时间:2018-09-20 格式:DOC 页数:8 大小:46KB
下载 相关 举报
游戏开发基础(3)new.doc_第1页
第1页 / 共8页
游戏开发基础(3)new.doc_第2页
第2页 / 共8页
游戏开发基础(3)new.doc_第3页
第3页 / 共8页
游戏开发基础(3)new.doc_第4页
第4页 / 共8页
游戏开发基础(3)new.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

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

2、ows 游戏开发提供一个具有鲁棒性的、标准化的操作环境。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)* 访问 Micro

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

5、、可升级的软件结构。COM使用一个面向对象的模型,这要比像 C+等语言所用的模型更严格。例如,COM对象经常通过成员函数进行存取,而且并不具备公共数据成员。COM 对继承性的支持与 C+相比也是有限的。很多 DirectX 中 API 是作为 COM 对象的实例来创建的。您可以这样看:对象就象一个黑盒子,它代表了硬件,从而需要通过一个接口与应用程序进行联络。通过COM 接口发送和接收的命令被称为“ 方式(method)”。例如,方式IDirectDraw2:GetDisplayMode 是通过接口 IDirectDraw2 发送,从而能够从DirectDraw 对象得到当前显示适配器的显示模式

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

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

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

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

10、hr = g_pMouse-SetDataFormat(if (FAILED(hr) Complain(hwnd, hr, “SetDataFormat(SysMouse, dfDIMouse)“);return FALSE;设置鼠标行为:hr = g_pMouse-SetCooperativeLevel(hwnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);/后面的两个标志符实现了前台运行时对输入设备的独占 if (FAILED(hr) Complain(hwnd, hr, “SetCooperativeLevel(SysMouse)“);return FALS

11、E;要使用事件通告(event notification)来发觉鼠标的动作并将经过缓冲的鼠标输入读进来,这都需要进行一些设置。首先,创建一个事件,将它与鼠标联系起来。当发生硬件中断时,就可以告诉鼠标设备对象有新的数据来到。/ HANDLE g_hevtMouse; / 全局变量g_hevtMouse = CreateEvent(0, 0, 0, 0);if (g_hevtMouse = NULL) Complain(hwnd, GetLastError(), “CreateEvent“);return FALSE;hr = g_pMouse-SetEventNotification(g_hev

12、tMouse);if (FAILED(hr) Complain(hwnd, hr, “SetEventNotification(SysMouse)“);return FALSE;现在您需要设定缓冲区大小。在此之前要初始化一个 DIPROPDWORD 结构,这当中很多数量是无关紧要的,关键是最后一个,dwData,它决定了缓冲区中可容纳项目的数量。#define DINPUT_BUFFERSIZE 16DIPROPDWORD dipdw =/ the headersizeof(DIPROPDWORD), / diph.dwSizesizeof(DIPROPHEADER), / diph.dwHe

13、aderSize0, / diph.dwObjDIPH_DEVICE, / diph.dwHow,/ the dataDINPUT_BUFFERSIZE, / dwData;接着按照您希望改变的属性的标志符,将头地址传送给IDirectInputDevice:SetProperty 方式:hr = g_pMouse-SetProperty(DIPROP_BUFFERSIZE, if (FAILED(hr) Complain(hwnd, hr, “Set buffer size(SysMouse)“);return FALSE;至此,设置结束。然后开始根据程序的要求操作鼠标。第八节 Direct

14、3DDirect3D 提供了与硬件无关的的 3D 视频硬件操作方式。您可以在两种模式(立即模式和保留模式)中选择其中之一使用。立即模式较保留模式是一个低层的 3D API,后者建构于前者之上。立即模式适合于开发高品质的多媒体应用程序,它在底层与加速硬件进行通讯。保留模式应用于对 3D 场景进行实时的操纵。对 3D 场景的操作是基于矩阵和多边形的运算,这是创建和管理 3D 的基础知识,在很多资料中均可获得。使用立即模式可以选择通过调用 DrawPrimitive 方式或利用执行缓冲区。对于初学者一般从调用 DrawPrimitive 方式。不过,千万不要认为两者有优劣之分。在熟悉了 Direct

15、3D 后,使用哪个方法取决于您应用程序的要求。前者的方法与其它COM 雷同;在利用执行缓冲区的方法时,要创建 DirectDraw 和 Direct3D 对象,设置渲染状态,填充执行缓冲区等。无论哪种模式,应用程序与硬件的通讯都很类似。正如下图所示。由于 Direct3D相当于 DirectDraw 对象的一个接口,这里的 HAL 被表示为 DirectDraw/Direct3D HAL。对保留模式的操作是通过使用一些对象来实现的。Direct3D 和 DirectDraw 是紧密联系在一起的。一个 DirectDraw 对象将 DirectDraw 和 Direct3D 状态封装起来,通过

16、IDirectDraw:QueryInterface 方式将 IDirect3D 接口转换为 DirectDraw 对象。有一个很重要的概念是 z 缓冲区。它决定了将很多显示内容如何覆盖和裁剪。如果没有 z 缓冲区,保留模式无法给覆盖层排序。没有指定 z 顺序的覆盖层被缺省设定为 0,处于最底层。一共可以有四十亿个覆盖层(应该够用了吧!), z 顺序为 2 的层将可能遮掩了 z 顺序为 1 的层的某些内容。记住,不能有两个层的 z 顺序相同。关于 3D 场景,还有诸如材资、光源等概念,在此不再一一聱述。第九节 Vc+中引入 Direct SDK一旦安装了 SDK,就得马上通知 Visual C

17、+ SDK 的位置。默认状态下,SDK 安装在 dxsdk 目录下。头文件放在 dxsdk/inc 目录下,库文件放在 dxsdk/lib 目录下。可利用下述两种方法之一通知 visual C+ SDK 的位置。一种方法是在使用文件时给出完整的文件路径;另一种法是将这些目录加到 Visual C+的搜索路径中。第二种方法更好一些,可以通过 ToolsOptionsDirectories 对话框实现。增加 dxsdk/lib 目录的方法大体上同增加 dxsdk/inc 目录的方法相同。如果你获得了一个含有比 Visual C+的 DirectX SDK 新的版本,您需要将 DirectX SDK

18、 目录置于常规的 Visual C+目录上面。否则就得使用旧版本。(Visual C+从上至下查找目录)根据我们已经讨论过的内容,你应该能够编辑 DirectX 程序了。然而还有最后一个潜在的障碍。除非 INITGUID 符号已经被定义,否则在 DirectX GUIDs 下调用Query-Interface()函数的程序同 DirectX2 SDK 的链接会失败。 INITGUID 符号只能由一个源文件定义,并且必须出现在#include 语句之前,如下列代码所示:#define INITGUID#includeddraw.h/other includes对于 DirectX3 及以上版本,这种解决方法都是有效的,但还有一个更好的方法,即将 dxguid.lib 文件链接到你的工程上 (BuildSettingsLink 对话框) ,以替代INITGUID 符号的定义。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报