游戏摇杆编程

前言

基于前面几篇博文的介绍,我们可以进行编程,以获取游戏遥感所传回的数据。
前文回顾:

本文的编程环境及工具如下:

  • IDE: Visual Studio 2013
  • 系统:Windows 7 旗舰版 64位

摇杆介绍

本文所使用的摇杆是图马思特牌的 T.16000M FCS升级版霍尔磁感应摇杆
在这里插入图片描述

技术特性

在图1中,12个部件的名称分别为:

  1. 数字扳机(按键1)
  2. 多向苦力帽开关(POV帽)
  3. 右旋螺丝盖
  4. 方向舵,通过旋转带掌托的手柄进行控制
  5. 油门
  6. 15 个操作按钮
  7. 掌托旋转螺丝(带有右利手或左利手档位)
  8. 右利手拇指托
  9. PC USB 接口
  10. 左利手拇指托
  11. 左旋螺丝盖
  12. 右利手或左利手按钮选择器开关

英文名称

  1. Digital trigger
  2. Multidirectional “Point of View” hat switch
  3. Right-handed screw cover
  4. Rudder control via rotating handle with hand rest
  5. Throttle
  6. 15 action buttons
  7. Hand rest rotation screw, with righthanded or left-handed positions
  8. Right-handed thumb rest
  9. PC USB connector
  10. Left-handed thumb rest
  11. Left-handed screw cover
  12. Right-handed or left-handed buttons selector switch

方向舵功能

本摇杆具有方向舵功能 (4),类似于飞机上飞行员通过踩踏踏板来移动方向舵,使飞机可以围绕其垂直轴旋转(让飞机可以左右旋转)。在本摇杆上,可以通过向左或向右旋转操纵杆来实现方向舵功能。

多向苦力(POV)帽开关

本摇杆配有苦力帽开关 (2) ,也称为“视角帽”开关,顾名思义,通过该开关,您可以(在支持该功能的游戏中)即时查看飞机周围的情况。若要使用此功能,请进入游戏的设置菜单,将各个视图(后视图、左视图、右视图及外部视图)设置到苦力帽开关的相应方向上。如果您愿意,也可以将苦力帽开关设为其他用途(开火等)。

在图2中,分别展示了左利手和右利手的安装。

在图3 和图4中,分别展示操纵杆传感器的分辨率,且在编程中与结构体JOYINFOEX成员(见:WindowsAPI之joystickapi(游戏摇杆)头文件4)对应关系为:

传感器对应结构体成员说明
按键dwButtons16个,编号分别如图所示
X轴方向dwXpos0-16383
Y轴方向dwYpos0-16383
油门值dwZpos0-255
方向舵值dwRpos0-255
POV帽dwPOV9个方向(包括中立方向)

源程序

获取摇杆功能信息

此部分主要参考: 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。
  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值