Qt之与游戏手柄的交互(一)

您所在的位置:网站首页 xbox蓝牙检测不到 Qt之与游戏手柄的交互(一)

Qt之与游戏手柄的交互(一)

2024-04-01 05:31| 来源: 网络整理| 查看: 265

用途

通过手柄与Qt的通信,发送指令至远程设备,控制远程设备的运动。

手柄种类

市面上的游戏手柄也有多种种类,主流的是蓝牙手柄、2.4g手柄和usb手柄。2.4g手柄有的会识别出来是Xbox设备,有的识别出来是usb设备。 本文中的方法只支持Xbox手柄,使用其他手柄不会被Qt的手柄模块识别到,这里用的是淘宝销量第一的北通手柄,接收器接上电脑后会识别为Xbox360设备,如下图: 在这里插入图片描述 其它手柄可能会识别为下图的设备,不会被Qt手柄模块识别: 在这里插入图片描述 在这里插入图片描述

方法

通过探究,发现了两种Qt与游戏手柄通信的方法。

方法一:使用Qt的QtGamepad模块,也就是本文中的方法,此方法非常简单易用。但是,此模块不支持蓝牙手柄和usb手柄。不过只要是Xbox手柄,按键的映射都统一,不会错乱。方法二:使用Windows的手柄模块的API。此方法可以支持上述的所有手柄,但是我这边测试了四个主流手柄,按键映射有三款都不一样,而且有两个是相同品牌的手柄按键映射也不一致,这样想要换手柄就比较麻烦,还要改映射。

按键映射:就是手柄实际按键对应手柄驱动(手柄模块)中的按键的对应关系。

按键

这里以北通阿修罗手柄为例,标识出了按键映射,如下图: 在这里插入图片描述

实现 下面是用QML写的,官方的示例 在这里插入图片描述 主要代码(QML的文档中没有对Gamepad的介绍,可以参考Qt C++中的QGamepad进行开发): Gamepad { id: gamepad //检测并连接设备 deviceId: GamepadManager.connectedGamepads.length > 0 ? GamepadManager.connectedGamepads[0] : -1 //获取手柄左摇杆的Y轴的值 onAxisLeftYChanged: { console.log(gamepad.axisLeftY) } } 下面写了个C++的示例,测试按键的状态和键值 在这里插入图片描述 主要代码: //连接设备 QGamepad *m_gamepad = new QGamepad(0, this); ... //显示手柄按下的按键的名称 connect(m_gamepad, &QGamepad::buttonAChanged, this, [=](bool pressed){ showCurrentBtnName(pressed, "buttonA"); }); connect(m_gamepad, &QGamepad::buttonBChanged, this, [=](bool pressed){ showCurrentBtnName(pressed, "buttonB"); }); ... //显示摇杆的值 connect(m_gamepad, &QGamepad::buttonL2Changed, this, [=](double value){ showBtnVaule(1, value); }); connect(m_gamepad, &QGamepad::buttonR2Changed, this, [=](double value){ showBtnVaule(2, value); }); 示例代码

https://download.csdn.net/download/zbw1185/10694488



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3