前言
基于前面几篇博文的介绍,我们可以进行编程,以获取游戏遥感所传回的数据。
前文回顾:
- WindowsAPI之joystickapi(游戏摇杆)头文件
- Windows API 之joystickapi(游戏摇杆)头文件2
- Windows API 之joystickapi(游戏摇杆)头文件3
- Windows API 之joystickapi(游戏摇杆)头文件4
本文的编程环境及工具如下:
- IDE: Visual Studio 2013
- 系统:Windows 7 旗舰版 64位
摇杆介绍
本文所使用的摇杆是图马思特牌的 T.16000M FCS升级版霍尔磁感应摇杆。
技术特性
在图1中,12个部件的名称分别为:
- 数字扳机(按键1)
- 多向苦力帽开关(POV帽)
- 右旋螺丝盖
- 方向舵,通过旋转带掌托的手柄进行控制
- 油门
- 15 个操作按钮
- 掌托旋转螺丝(带有右利手或左利手档位)
- 右利手拇指托
- PC USB 接口
- 左利手拇指托
- 左旋螺丝盖
- 右利手或左利手按钮选择器开关
英文名称
- Digital trigger
- Multidirectional “Point of View” hat switch
- Right-handed screw cover
- Rudder control via rotating handle with hand rest
- Throttle
- 15 action buttons
- Hand rest rotation screw, with righthanded or left-handed positions
- Right-handed thumb rest
- PC USB connector
- Left-handed thumb rest
- Left-handed screw cover
- Right-handed or left-handed buttons selector switch
方向舵功能
本摇杆具有方向舵功能 (4),类似于飞机上飞行员通过踩踏踏板来移动方向舵,使飞机可以围绕其垂直轴旋转(让飞机可以左右旋转)。在本摇杆上,可以通过向左或向右旋转操纵杆来实现方向舵功能。
多向苦力(POV)帽开关
本摇杆配有苦力帽开关 (2) ,也称为“视角帽”开关,顾名思义,通过该开关,您可以(在支持该功能的游戏中)即时查看飞机周围的情况。若要使用此功能,请进入游戏的设置菜单,将各个视图(后视图、左视图、右视图及外部视图)设置到苦力帽开关的相应方向上。如果您愿意,也可以将苦力帽开关设为其他用途(开火等)。
在图2中,分别展示了左利手和右利手的安装。
在图3 和图4中,分别展示操纵杆传感器的分辨率,且在编程中与结构体JOYINFOEX成员(见:WindowsAPI之joystickapi(游戏摇杆)头文件4)对应关系为:
传感器 | 对应结构体成员 | 说明 |
---|---|---|
按键 | dwButtons | 16个,编号分别如图所示 |
X轴方向 | dwXpos | 0-16383 |
Y轴方向 | dwYpos | 0-16383 |
油门值 | dwZpos | 0-255 |
方向舵值 | dwRpos | 0-255 |
POV帽 | dwPOV | 9个方向(包括中立方向) |
源程序
获取摇杆功能信息
此部分主要参考: Windows API 之joystickapi(游戏摇杆)头文件2。
#include <iostream>
#include <Windows.h>
#include <joystickapi.h>
using namespace std;
int main()
{
JOYCAPSA jc;//创建结构体变量,用来获取摇杆支持的功能
joyGetDevCapsA(JOYSTICKID2, &jc, sizeof JOYCAPSA);//由于我的电脑有一个默认摇杆驱动,所以本操纵杆为设备2
//输出摇杆的功能信息
cout << "制造商标识符:" << jc.wMid << endl;
cout << "产品商标识符:" << jc.wPid << endl;
cout <<"产品名称:"<< jc.szPname << endl;
cout << "最小X坐标:" << jc.wXmin << endl;
cout << "最大X坐标:" << jc.wXmax << endl;
cout << "最小Y坐标:" << jc.wYmin << endl;
cout << "最大Y坐标:" << jc.wYmax << endl;
cout << "最小Z坐标:" << jc.wZmin << endl;
cout << "最大Z坐标:" << jc.wZmax << endl;
cout << "操纵杆数量:" << jc.wNumButtons << endl;
cout << "最小轮询频率:" << jc.wPeriodMin << endl;
cout << "最大轮询频率:" << jc.wPeriodMax << endl;
cout << "最小舵值:" << jc.wRmin << endl;
cout << "最大舵值:" << jc.wRmax << endl;
cout << "最小U坐标:" << jc.wUmin << endl;
cout << "最大U坐标:" << jc.wUmax << endl;
cout << "最小V坐标:" << jc.wVmin << endl;
cout << "最大V坐标:" << jc.wVmax << endl;
cout << "操纵杆功能:" << jc.wCaps << endl;
cout << "最大轴数:" << jc.wMaxAxes << endl;
cout << "当前轴数:" << jc.wNumAxes << endl;
cout << "最大按键数:" << jc.wMaxButtons << endl;
cout << "注册表项:" << jc.szRegKey << endl;
cout << "驱动程序oem:" << jc.szOEMVxD << endl;
cout << endl;
}
注意:
- 此处的操纵杆功能为51,这个编码应该是错的。
获取摇杆当前状态
此部分主要参考: Windows API 之joystickapi(游戏摇杆)头文件4。
#include <iostream>
#include <Windows.h>
#include <joystickapi.h>
using namespace std;
int main()
{
LPJOYINFOEX info = new JOYINFOEX;//创建当前摇杆信息对象
//需要首先设定结构体中成员dwSize和dwFlags。
info->dwSize = 13 * 4;//最小值,否则会报错
info->dwFlags = JOY_RETURNBUTTONS | JOY_RETURNRAWDATA;//唯一找到的有用的标识符
while (true)
{
//不断读取摇杆的当前状态,且返回
cout << "返回值:" << joyGetPosEx(JOYSTICKID2, info) << endl;//同上,设备的编号是2
cout << "size:" << info->dwSize << endl;
cout << "flags:" << info->dwFlags << endl;
cout << "xpos:" << info->dwXpos << endl;
cout << "ypos:" << info->dwYpos << endl;
cout << "zpos:" << info->dwZpos << endl;
cout << "rpos:" << info->dwRpos << endl;
cout << "upos:" << info->dwUpos << endl;
cout << "vpos:" << info->dwVpos << endl;
cout << "buttons:" << info->dwButtons << endl;
cout << "buttonNumber:" << info->dwButtonNumber << endl;
cout << "POV:" << info->dwPOV << endl;
cout << endl;
Sleep(1000);//程序暂停1秒
}
return 0;
}
默认位置:
随机晃动时,读数变化:
注意:
- 在实际编程中,结构体中成员dwSize和dwFlags可以不用设置,依然可以获得正确的结果值。
- 当dwSize设定值小于52(能够存储所有参数的最小值)时,joyGetPosEx(JOYSTICKID2, info)将会运行出错。
- 在dwFlags中,只有JOY_RETURNBUTTONS 和 JOY_RETURNRAWDATA两个标志有效果。
- JOY_RETURNRAWDATA若被清零时,6轴的返回值取值返回变为0-66535。
- JOY_RETURNBUTTONS若被清零时,无论按键是否按下,按键返回值始终为0。