本系列文章由zhmxy555(毛星云)编写,转载请注明出处。
文章链接: http://blog.csdn.net/zhmxy555/article/details/8547531
作者:毛星云(浅墨) 邮箱: happylifemxy@163.com
------------------------------------------------------------------------------------------------------------------------------
浅墨历时一年为游戏编程爱好者锻造的著作:《逐梦旅程:Windows游戏编程之从零开始》
如果你喜欢浅墨写的【Visual C++】游戏开发系列博客文章,那么你一定会爱上这本书。
这是浅墨专门为热爱游戏编程的朋友们写的入门级游戏编程宝典。
------------------------------------------------------------------------------------------------------------------------------
在本篇文章中,我们一起详细探索了DirectInput这套在PC游戏即时控制方面一手遮天的API。下面先来看一下这篇一万多字文章的大体脉络。首先我们对DirectInput接口进行了整体上的讲解,然后深入DirectInput的使用步骤进行具体的探索,最后浅出,归纳出DirectInput使用五步曲,方便大家的快速掌握。文章最后,我们配了一个比较好玩的demo来让大家对本篇文章所学的DirectInput的使用融会贯通,最后提供了这个demo详细注释的源代码下载。先放一个demo的截图吊吊大家胃口,哈哈:
一、引言
众所周知,在普通的Windows程序中,用户通过键盘或者鼠标输入的消息并不是应用程序直接处理的,而是通过Windows的消息机制转发给Windows操作系统的。Windows操作系统对这些消息进行响应后,在通过回调应用程序的窗口过程函数进行相应的消息处理。
这显然满足不了对于性能要求比较苛刻的游戏程序的。在DirectX中,微软为我们提供了名为DirectInput接口对象来实现用户输入的。DirectInput直接和硬件驱动打交道,因此处理起用户的输入来说非常迅速。
首先需要给大家说明的是,DirectInput这套API自DirectX8更新以来,功能已经足够完善了。所以尽管当前DirectX的最新版本上升到了DirectX 11,DirectInput还是DirectX 8那个版本时代的老样子,API的内容和功能随着最近几个版本的更迭却原封不动,名称上也保留了8这个版本号,依然叫DirectInput 8,可谓以不变应万变。即目前最新版本的DirectInput ,依旧是DirectInput 8。
二、DirectInput接口概述
DirectInput作为DirectX的组件之一,自然依然是一些COM对象的集合。DirectInput由IDirectInput8、IDirectInputDevice8,IDirectInputEffect这三个接口组成,这三个接口中又分别含有各自的方法。
总的来说,当前版本的DirectInputAPI中,三个接口,四十七个方法,组成了这个在电脑游戏开发中不可或缺的组件。
由于IDirectInput8 API整体来说规模不大,说白了也就是三个接口,四十七个方法,不妨我们在文章中将他们一一列举出来,也让大家窥一窥DirectInput API的全貌。
1.IDirectInput8接口 函数一览
IDirectInput8::ConfigureDevices Method
IDirectInput8::CreateDevice Method
IDirectInput8::EnumDevices Method
IDirectInput8::EnumDevicesBySemantics Method
IDirectInput8::FindDevice Method
IDirectInput8::GetDeviceStatus Method
IDirectInput8::Initialize Method
IDirectInput8::RunControlPanel Method
2.IDirectInputDevice8接口 函数一览
IDirectInputDevice8::Acquire Method
IDirectInputDevice8::BuildActionMap Method
IDirectInputDevice8::CreateEffect Method
IDirectInputDevice8::EnumCreatedEffectObjects Method
IDirectInputDevice8::EnumEffects Method
IDirectInputDevice8::EnumEffectsInFile Method
IDirectInputDevice8::EnumObjects Method
IDirectInputDevice8::Escape Method
IDirectInputDevice8::GetCapabilities Method
IDirectInputDevice8::GetDeviceData Method
IDirectInputDevice8::GetDeviceInfo Method
IDirectInputDevice8::GetDeviceState Method
IDirectInputDevice8::GetEffectInfo Method
IDirectInputDevice8::GetForceFeedbackState Method
IDirectInputDevice8::GetImageInfo Method
IDirectInputDevice8::GetObjectInfo Method
IDirectInputDevice8::GetProperty Method
IDirectInputDevice8::Initialize Method
IDirectInputDevice8::Poll Method
IDirectInputDevice8::RunControlPanel Method
IDirectInputDevice8::SendDeviceData Method
IDirectInputDevice8::SendForceFeedbackCommand Method
IDirectInputDevice8::SetActionMap Method
IDirectInputDevice8::SetCooperativeLevel Method
IDirectInputDevice8::SetDataFormat Method
IDirectInputDevice8::SetEventNotification Method
IDirectInputDevice8::SetProperty Method
IDirectInputDevice8::Unacquire Method
IDirectInputDevice8::WriteEffectToFile Method
3.IDirectInputEffect接口 函数一览
IDirectInputEffect::Download Method
IDirectInputEffect::Escape Method
IDirectInputEffect::GetEffectGuid Method
IDirectInputEffect::GetEffectStatus Method
IDirectInputEffect::GetParameters Method
IDirectInputEffect::Initialize Method
IDirectInputEffect::SetParameters Method
IDirectInputEffect::Start Method
IDirectInputEffect::Stop Method
IDirectInputEffect::Unload Method
其中,IDirectInput8作为DirectInput API中最主要的接口,用于初始化系统以及创建输入设备接口,DirectInput中其他的所有的接口都需要依赖于我们的IDirectInput8之上,都是通过这个接口进行查询的。而DirectInputDevice8接口用于表示各种输入设备(如键盘、鼠标和游戏杆),并提供了相同的访问和控制方法。对于某些输入设备(如游戏杆和鼠标),都能通过查询各自的IDirectInputDevice8接口对象,得到另一个接口IDirectInputEffect8。而IDirectInputEffect8接口则用于控制设备的力反馈效果。
三、DirectInput使用步骤详解
1.头文件和库文件的包含
我们首先需要注意的是,在使用DirectInput时,需要保证我们包含了DInput.h头文件,并且在项目中已经链接了DInput8.lib库文件。
当然,库文件我们也可以动态添加:
#pragma comment(lib, "dinput8.lib") // 使用DirectInput必须包含的头文件,注意这里有8
2.创建DirectInput接口和设备
在DirectInput中我通过们调用DirectInputCreate函数创建并初始化IDirectInput接口,我们可以在MSDN中查到该函数的声明如下:
HRESULT DirectInput8Create( HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID * ppvOut, LPUNKNOWN punkOuter)
■ 第一个参数,HINSTANCE类型的hinst,表示我们当前创建的DirectInput的Windows程序句柄,这个值填我们在WinMain函数的参数中的实例句柄就可以了。
■ 第二个参数,DWORD类型的dwVersion,表示我们当前使用的DirectInput版本号,通常可以取DIRECTINPUT_VERSION或者DIRECTINPUT_HEADER_VERSION,这两个值对应的是同一个值,为0x0800。所以我们在这里还可以直接填0x0800。
归根揭底的话,可以通过【转到定义】大法在dinput.h中查到有如下代码:
#define DIRECTINPUT_HEADER_VERSION 0x0800#ifndef DI