最近給自己買了個 switch,由於"獨樂樂不如衆樂樂",又新購入了一個“良值”牌的手柄。手柄到貨的時候我還在公司,沒法用 switch 實機測試手柄好用不好用, 就打算用 windows 自帶的手柄檢測軟件測試一下。
插到 PC 上, 欣喜的發現啥驅動都不用安裝(可能是自動安裝好了),手柄就識別了。用 windows 自帶的軟件測試了幾下,沒有啥問題,網上說的十字鍵串鍵位的問題也沒有。
由於 windows 的測試軟件都能識別手柄,我就在想自己寫的代碼是不是應該也能識別這個手柄呢。打算寫個代碼試試。
說到對硬件設備訪問的支持,我第一反應是 SDL2 這個庫。但是由於手頭線程的工程是 一個 glfw 的 OpenGL 工程,就暫時放棄了 SDL2,先用 glfw 試試吧。
GLFW 官網文檔 非常詳細.搜索 JoyStick 相關的幾個 api 就出來了。
幾個 api 非常簡潔
-
glfwJoystickPresent
int present = glfwJoystickPresent(GLFW_JOYSTICK_1);
用於檢測手柄是否連接 -
glfwGetJoystickAxes
int count;int count;
const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &count);
用於檢測手柄方向軸的數量,返回到 count 裏。
返回值是 每個軸 當前的數值 -
glfwGetJoystickButtons
int count;
const unsigned char* axes = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &count);
用於檢測手柄按鍵的數量,返回到 count 裏。
返回值 是 每個按鍵是否被按下了 -
glfwGetJoystickName
const char* name = glfwGetJoystickName(GLFW_JOYSTICK_1);
返回手柄的名字 -
glfwSetJoystickCallback(joystick_callback)
void joystick_callback(int joy, int event)
{
if (event == GLFW_CONNECTED)
{
// The joystick was connected
}
else if (event == GLFW_DISCONNECTED)
{
// The joystick was disconnected
}
}
用於設置手柄的連接、斷開回調。
一共就這麼5個 api ,完全足夠根據這幾個 api 寫一個健壯的手柄狀態管理器了。自己寫了個控制檯輸出的小程序,插拔手柄,測試按鍵,基本沒啥問題。雖然沒什麼技術含量,但是覺得挺有趣的。
有了這個”良值“手柄,以後自己再鼓搗啥小程序小遊戲,就可以考慮用支持手柄操作了。SDL2 對手柄支持的 api 還沒看,猜測也差不多?
glfw 對手柄的支持非常簡潔,但是缺點是比較依賴於 OpenGL .如果純論移植性,SDL庫肯定更勝一籌。有空可以折騰一下看看。