Qt之與遊戲手柄的互動(一)
阿新 • • 發佈:2018-12-12
用途
通過手柄與Qt的通訊,傳送指令至遠端裝置,控制遠端裝置的運動。
手柄種類
市面上的遊戲手柄也有多種種類,主流的是藍芽手柄
、2.4g手柄
和usb手柄
。2.4g手柄有的會識別出來是Xbox裝置,有的識別出來是usb裝置。
本文中的方法只支援Xbox手柄,使用其他手柄不會被Qt的手柄模組識別到,這裡用的是淘寶銷量第一的北通手柄,接收器接上電腦後會識別為Xbox360裝置,如下圖:
其它手柄可能會識別為下圖的裝置,不會被Qt手柄模組識別:
方法
通過探究,發現了兩種Qt與遊戲手柄通訊的方法。
- 方法一:使用Qt的QtGamepad模組,也就是本文中的方法,此方法非常簡單易用。但是,此模組不支援藍芽手柄和usb手柄。不過只要是Xbox手柄,按鍵的對映都統一,不會錯亂。
- 方法二:使用Windows的手柄模組的API。此方法可以支援上述的所有手柄,但是我這邊測試了四個主流手柄,按鍵對映有三款都不一樣,而且有兩個是相同品牌的手柄按鍵對映也不一致,這樣想要換手柄就比較麻煩,還要改對映。
按鍵對映:就是手柄實際按鍵對應手柄驅動(手柄模組)中的按鍵的對應關係。
按鍵
這裡以北通阿修羅手柄為例,標識出了按鍵對映,如下圖:
實現
- 下面是用QML寫的,官方的示例 主要程式碼:
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); });