【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器 DirectInput专场

本文深入探讨DirectInput在游戏输入控制中的应用,详细解析DirectInput接口及使用步骤,包括DirectInput的创建、设备管理、数据格式设置、协作级别、设备属性和设备读取等关键环节,旨在帮助开发者快速掌握DirectInput的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 

 

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  

文章链接: http://blog.youkuaiyun.com/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 DIRECTINPUT_VERSION#define DIRECTINPUT_VERSION       DIRECTINPUT_HEADER_VERSION

大体意思很清楚了吧,先定义一下DIRECTINPUT_HEADER_VERSION=0x0800,然后再说如果没有定义DIRECTINPUT_VERSION的话,就定义一个DIRECTINPUT_VERSION= DIRECTINPUT_HEADER_VERSION。

 

■ 第三个参数,REFIID类型的riidltf,表示接口的标志,通常取IID_IDirectInput8就可以了。

■ 第四个参数,LPVOID 类型的* ppvOut,用于返回我们新创建的IDirectInput8接口对象的指针。

■ 第五个参数,LPUNKNOWN类型的punkOuter,一个和COM对象接口相关的参数,通常我们设为NULL就可以了。

 

这个函数执行成功的话TINPUTVER会返回HRESULT类型的DI_OK,而失败的话根据不同的调用失败原因,会返回DIERR_BETADIRECSION,DIERR_INVALIDPARAM,DIERR_OLDDIRECTINPUTVERSION, DIERR_OUTOFMEMORY中的一个。所以我们可以根据FAILED宏来判断我们IDirectInput8接口对象是否创建成功了。

下面是一个调用的例子:

// 创建DirectInput设备LPDIRECTINPUT8         g_pDirectInput      = NULL;if(FAILED(DirectInput8Create(hInstance,0x0800, IID_IDirectInput8,(void**)&g_pDirectInput, NULL)))              return E_FAIL;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值