1. 程式人生 > >Qt之與遊戲手柄的互動(一)

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

用途

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

示例程式碼