为什么SDL_NumJoysticks()永远不会更新?

时间:2014-01-19 23:23:58

标签: sdl joystick

我在C中编写了一个使用SDL 2.0的小程序,当我无法让SDL_NumJoysticks()报告函数调用时插入的操纵杆数量时遇到了问题。我相信它报告了在SDL的一个初始化函数中连接的操纵杆的数量(我猜是'SDL_Init()',但我没有证据),然后继续在整个程序的其余部分给你这个数字。这是我一直在使用的简短测试程序:

#include <stdio.h>
#include <SDL2/SDL.h>

int main() {
    SDL_Event event;
    SDL_Window *window;
    short joysticks = 0;

    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) {
        fprintf(stderr, "SDL_Init error: %s\n", SDL_GetError());
        return 1;
    }

    window = SDL_CreateWindow("Test window", 0, 0, 800, 600, SDL_WINDOW_SHOWN);
    if (window == NULL) {
        fprintf(stderr, "SDL_CreateWindow error: %s\n", SDL_GetError());
        return 1;
    }

    printf("%s\n", SDL_GetError());

    while (1) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                printf("%s\n", SDL_GetError());
                SDL_DestroyWindow(window);
                SDL_Quit();
                return 0;
            } else if (event.type == SDL_JOYDEVICEADDED) {
                printf("Joystick added!\n");
            } else if (event.type == SDL_JOYDEVICEREMOVED) {
                printf("Joystick removed!\n");
            }
        }

        if (SDL_NumJoysticks() > joysticks) {
            printf("Joystick inserted.\n");
            joysticks++;
        } else if (SDL_NumJoysticks() < joysticks && SDL_NumJoysticks() >= 0) {
            printf("Joystick removed.\n");
            joysticks--;
        } else if (SDL_NumJoysticks() < 0) {
            printf("Something went wrong!\n");
            SDL_DestroyWindow(window);
            SDL_Quit();
            return 1;
        }
    }

    return 0;
}

该程序准确报告程序启动时插入的操纵杆数量,但在此之后绝对没有。

SDL_Numjoysticks()的official SDL docs表示“返回成功时附加的操纵杆的数量”。如何让它告诉我在函数调用时插入的操纵杆数量?我在代码中犯了错误,或者这不是SDL_NumJoysticks()的工作方式吗?

1 个答案:

答案 0 :(得分:4)

请务必按照以下步骤查看是否仍有问题:

  • 在SDL_INIT之后调用SDL_JoystickEventState(SDL_ENABLE)
  • 如果这还不够,请尝试通过调用SDL_JoystickUpdate()强制更新; while while(SDL_PollEvent(&amp; event))

编辑:我认为应该有用的更多信息:

  • 始终在主线程上调用SDL_PollEvent(或主线程上的SDL_PumpEvents()和其他地方的SDL_PeepEvents)
  • 如果你不这样做,SDL不会更新游戏杆数量和热插拔事件
  • 当您在主线程外部进行操作时,其他操纵杆事件会起作用,但不建议这样做。