最近给自己买了个 switch,由于"独乐乐不如众乐乐",又新购入了一个“良值”牌的手柄。手柄到货的时候我还在公司,没法用 switch 实机测试手柄好用不好用, 就打算用 windows 自带的手柄检测软件测试一下。
插到 PC 上, 欣喜的发现啥驱动都不用安装(可能是自动安装好了),手柄就识别了。用 windows 自带的软件测试了几下,没有啥问题,网上说的十字键串键位的问题也没有。
由于 windows 的测试软件都能识别手柄,我就在想自己写的代码是不是应该也能识别这个手柄呢。打算写个代码试试。
说到对硬件设备访问的支持,我第一反应是 SDL2 这个库。但是由于手头线程的工程是 一个 glfw 的 OpenGL 工程,就暂时放弃了 SDL2,先用 glfw 试试吧。

GLFW 官网文档 非常详细.搜索 JoyStick 相关的几个 api 就出来了。

glfw JoyStick 相关文档的链接

几个 api 非常简洁

  1. glfwJoystickPresent
int present = glfwJoystickPresent(GLFW_JOYSTICK_1);

  1. 用于检测手柄是否连接
  2. glfwGetJoystickAxes
int count;int count;
 const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &count);

  1. 用于检测手柄方向轴的数量,返回到 count 里。
    返回值是 每个轴 当前的数值
  2. glfwGetJoystickButtons
int count;
 const unsigned char* axes = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &count);

  1. 用于检测手柄按键的数量,返回到 count 里。
    返回值 是 每个按键是否被按下了
  2. glfwGetJoystickName
const char* name = glfwGetJoystickName(GLFW_JOYSTICK_1);

  1. 返回手柄的名字
  2. glfwSetJoystickCallback(joystick_callback)
1. 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库肯定更胜一筹。有空可以折腾一下看看。