Thrustmaster Hotas Warthog/猪杆/疣猪飞行操作杆开发

(第一次写博客,还望大家批评指正!!!)
法拓士/Thrustmaster Hotas Warthog 猪肝/猪杆/A10C/疣猪飞行操作杆(最顶尖的飞行摇杆)
Thrustmaster Hotas Warthog疣猪飞行杆

猪杆是美国空军授权按照美国A10C攻击机的操作杆1:1的比例仿制,全金属双手飞行控制器,总重3公斤。
美国A10攻击机

更具体的信息请移步官网:猪杆官网

现在,进入正题,看看怎么对 猪杆 进行开发。首先要强调的是,对操作杆的开发无非就是将其各种按钮、轴的状态读取回来,以作后续的控制使用。

本文重点分析如何在Windows下对猪杆进行开发(其他游戏操作杆或设备类似)。在Windows下对标准设备进行开发有多种方法,这里重点分析在Windows下通过Directinput来开发。

Directinput是微软专门为了Windows下的各种输入设备开发的一组API,DirectInput同时属于DirectX的组件之一,是一些COM对象的集合,主要针对各种键盘、鼠标、操作杆(joystick)、触摸板、力反馈设备、方向盘以及第一人称射击设备(DI8DEVTYPE_*)等。

接下来,就进入主题。
一、介绍一下Directinput的整体结构:
DirectInput主要由IDirectInput8、IDirectInputDevice8,IDirectInputEffect这三个接口组成,这三个接口中又分别含有各自的方法(Methods)。
DirectInputAPI中总共有三个接口,四十七个方法。
1.IDirectInput8接口函数(8个):
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接口函数(29个):
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接口函数(10个):
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使用步骤详解(引自 浅墨_毛星云 http://blog.csdn.net/poem_qianmo):

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; 

这步完成之后,咱们的定义的DIRECTINPUT8接口对象g_pDirectInput就有了权利,新官上任了。
在IDirectInput8接口中包含了很多用于初始化输入设备及获得设备接口的方法。其中,常用的方法为EnumDevices和CreateDevices。前者EnumDevices用于获得输入设备的类型,而后者CreateDevices用于为输入设备创建IDirectInputD

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值