【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场
在本篇文章中,我们一起详细探索了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库文件。 当然,库文件我们也可以动态添加:
[cpp] view plaincopyprint?
1. #pragma comment(lib, \使用DirectInput必须包含
的头文件,注意这里有8