试了试 glfw 对手柄支持的几个 api

最近给自己买了个 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);
    用于检测手柄是否连接

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

  3. glfwGetJoystickButtons
    int count;
    const unsigned char* axes = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &count);
    用于检测手柄按键的数量,返回到 count 里。
    返回值 是 每个按键是否被按下了

  4. glfwGetJoystickName
    const char* name = glfwGetJoystickName(GLFW_JOYSTICK_1);
    返回手柄的名字

  5. 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库肯定更胜一筹。有空可以折腾一下看看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是使用glfw开发一个3d场景的基本步骤: 1. 初始化glfw库 在程序开始时,需要初始化glfw库,以便使用glfw的各项功能。 ```c++ if (!glfwInit()) { // 初始化glfw失败 exit(EXIT_FAILURE); } ``` 2. 创建窗口 创建一个窗口,并设置窗口的大小、标题等属性。 ```c++ GLFWwindow* window = glfwCreateWindow(800, 600, "My 3D Scene", NULL, NULL); if (!window) { // 创建窗口失败 glfwTerminate(); exit(EXIT_FAILURE); } ``` 3. 设置当前上下文 将当前上下文设置为窗口的上下文,以便后续的OpenGL渲染操作。 ```c++ glfwMakeContextCurrent(window); ``` 4. 初始化GLEW库 GLEW是一个用于管理OpenGL扩展的库,需要在程序中先进行初始化。 ```c++ if (glewInit() != GLEW_OK) { // 初始化glew失败 glfwTerminate(); exit(EXIT_FAILURE); } ``` 5. 加载shader 加载顶点着色器和片元着色器,并将它们编译成shader程序。 ```c++ GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); ``` 6. 创建图形对象 创建一个3D立方体的顶点数据,以便后续渲染。 ```c++ GLfloat vertices[] = { // 前面 -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, // 后面 -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, // 上面 -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, // 下面 -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, // 左面 -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, // 右面 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, }; GLuint indices[] = { 0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20 }; GLuint VAO, VBO, EBO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glGenBuffers(1, &EBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); glBindVertexArray(0); ``` 7. 渲染场景 将shader程序绑定到OpenGL上下文中,并渲染上面创建的图形对象。 ```c++ while (!glfwWindowShouldClose(window)) { // 清空颜色缓冲区 glClear(GL_COLOR_BUFFER_BIT); // 使用shader程序 glUseProgram(shaderProgram); // 设置模型、视图、投影矩阵 glm::mat4 model = glm::mat4(1.0f); glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)800 / (float)600, 0.1f, 100.0f); GLuint modelLoc = glGetUniformLocation(shaderProgram, "model"); GLuint viewLoc = glGetUniformLocation(shaderProgram, "view"); GLuint projectionLoc = glGetUniformLocation(shaderProgram, "projection"); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection)); // 渲染图形 glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); glBindVertexArray(0); // 交换缓冲区 glfwSwapBuffers(window); glfwPollEvents(); } ``` 这样,一个基本的使用glfw开发的3d场景就完成了。当然,还有很多其他的细节和调整可以进行,比如光照、纹理等,可以根据实际需求进行进一步的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值