用途
通過手柄與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);
});