当前位置:51VIP源码软件音乐小游戏下载联盟网络学院程序开发VC → DirectX揭密

DirectX揭密

减小字体 增大字体 作者:      来源:本站整理  发布时间:2008-9-6 6:13:34 我要发布文章

DirectX是一套为Windows程序提供对系统硬件更紧密控制的组件。(表1列出了DirectX 5.0
的组件及其作用)。那么,紧密控制是什么意思呢?

组件 用途
DirectDraw 高速2D图象
DirectSound 短响应时间声音输出
Direct3D 高速3D图象
DirectInput 面向游戏的对游戏杆和其它输入设备的访问
DirectSetup 方便的安装DirectX组件
DirectPlay 面向游戏的通信和网络支持
DirectShow 视频流支持
DirectAnimation 动画录放支持


DirectX提供的硬件控制常常被描述成底层控制,这会使人联想起位操作和其它讨厌的事
情。实际上,DirectX组件包含许多高层API,使得象复制位图和播放声音等复杂的工作变
得相当简单。用"为程序提供比过去更好的对硬件的控制"来形容DirectX更准确。这在
Windows中是一个显著的特性,因为在Windows中,资源是共享的,并由控制。

DirectX组件遵守称为COM的二进制对象的工业标准。

开始DirectX
下面从DirectX的安装开始讲起。大多数情况下,某个好玩的游戏就会为系统安装DirectX。
为得到最新的版本,应该从最新的Microsoft Platform SDK中将DirectX安装到系统中。
可以在http://www.microsoft.com/msdn站点或者MSDN光盘中找到platform SDK。缺省情
况下,Microsoft Platform SDK被安装到缺省驱动器根目录下的\MSSDK目录中。DirectX
的头文件安装在\MSSDK\INCLUDE目录中,Lib文件安装在\MSSDK\LIB目录中。

Platform SDK包含了一些非常好的DirectX例子和文档。早期发布的DirectX 文档非常粗
略而且有些是错误的,现在的版本已经极大地改正了这一问题。最好要熟悉这些文档。

现在已经为安装利用DirectX的程序做好了准备。所幸的是,不必一次就处理DirectX的全
部功能。DirectX是一套可以分别使用的组件。实际上,在编程概念中,DirectX的不同部
分互相没有联系。它们仅仅是具有相同的设计风格和目标:使Windows的游戏编程变得容易。

使用DirectX组件的程序有什么特殊的地方吗?根本没有。使用DirectX组件的程序是基于
Win32的程序,它们使用普通Win32 API集,并且可以访问所有可以获得的工具。
实际上,DirectX既可以用于GUI程序,也可以用于控制台程序。可以直接用Petzold-style
SDK编程开发程序,也可以用基本类库,如MFC。总的说,唯一的要求是大多数DirectX组
件在程序中需要HWND,所以至少要有一个窗口。

虽然DirectX组件是分离的,但是每个组件的实现风格和使用都是相同的。DirectInput是
学习DirectX的非常好的出发点,原因是DirectInput是最简单的组件之一。
用力
以后在游戏中要"用力",这是电影《星球大战》中的说法,因为DirectInput中加入了相
当令人陶醉的力反馈支持。DirectX 5.0以前,DirectInput支持从鼠标和键盘读取输入,
这是一个有用但却令人厌烦的特性。DirectX 5.0中,DirectInput被扩充到支持具有以物
理力的形式向用户传播反馈的能力的设备。

如果不能立即理解上面的内容,下面就用一个游戏进行解释。假设你刚启动了你最喜欢的超
现实3D越野赛车游戏,正手握力反馈游戏杆。在起跑线上,你可以听到赛车引擎的空转声,
同时也能够通过游戏杆感觉到赛车引擎的空转!比赛开始后,你可以感觉到引擎高速旋转的
嗡嗡震动。当行驶到赛程中崎岖的地段时,你将会不停的感觉到电子碰撞。赛车在整个赛场
上撞来撞去,你的游戏杆也会如此。赛车车轮卡在车辙中导致赛车被拉向左边,游戏杆也会
被拉向左边!整个过程中你可以感觉到每次颠簸、刮擦、撞击和撞毁。

剖析DirectInput
DirectInput由三个对象组成:DirectInput, DirectInputDevice, 和DirectInputEffect (见
表2)。DirectInput是一个高层的对象,通过DirectInput对象可以对相关的输入设备进行
基本的初始化和查找。DirectInput对象最终用来创建低层的DirectInputDevice对象。
DirectX中的每个主要组件都采用相同的方法,首先创建高层对象,如DirectInput或
DirectSound对象,然后创建低层对象与硬件进行实际的通信。

表2: DirectInput对象
对象 说明
DirectInput 封装高层DirectInput功能,列举设备并用来创建DirectInputDevice对象。
DirectInputDevice 与物理输入设备的,例如游戏杆,包括收集和设置设备状态信息的
,并且用来创建DirectInputEffect对象 (对于力反馈设备)。
DirectInputEffect 封装能够在力反馈设备上"播放"的简单效果,提供启动、停止和设置
力反馈效果等功能。


DirectInput对象是三个对象中最容易理解的。实际上,它在一个形式IDirectInput (见
表3)中只提供五个。这是DirectInput的一个非常重要的部分,因为这是出发点。

表3:IdirectInput:
成员 说明
CreateDevice 创建一个DirectInputDevice对象并返回一个指向其IdirectInputDevice接
口的。
EnumDevices 为找到的与给定标准匹配的每个设备调用一个回调函数,每个回调提供一
个GUID,可以用在CreateDevice中创建DirectInputDevice对象。
GetDeviceStatus 测试物理设备是否连接到系统。
Initialize 如果DirectInput对象是使用CoCreateInstance创建的,那么在使用前必须调
用Initialize成员。如果DirectInput对象是使用DirectInputCreate创建的,那么就已
经初始化过了。
RunControlPanel 为设备运行Windows Control Panel程序,让用户安装新设备或者更改已
有设备的配置。 游戏杆校准可以在此处做。
创建DirectInput对象
为了创建DirectInput对象并得到其IdirectInput,应该在程序初始化阶段使用
两种方法之一完成。

第一种方法相当简单。DirectX提供了一个助手DirectInputCreate来创建并初始化
DirectInput对象。它与所有DirectInput的、和宏定义都在头文件DINPUT.H中
声明。实际的体在DINPUT.LIB文件中。DirectInputCreate如下定义:

HRESULT WINAPI DirectInputCreate(
HINSTANCE hinst,
DWORD dwVersion,
LPDIRECTINPUT * lplpDirectInput,
LPUNKNOWN punkOuter
);

第一个参数是应用程序的实例。第二个参数是程序需要的DirectInput版本,通常使用
DIRECTINPUT_VERSION宏,定义为当前版本。第三个参数最重要,如果对COM非常陌生的化
就很难理解,它是指向IdirectInput的的地址。程序中应该定义一个LPDIRECTINPUT
类型的变量(可以是全局的)并将其地址作为第三个参数传递给DirectInputCreate。

最后一个参数叫作punkOuter,与

[1] [2]  下一页