Qt之與遊戲手柄的交互(一)

用途

通過手柄與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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章