【问题标题】:Why does SDL_NumJoysticks() never update?为什么 SDL_NumJoysticks() 从不更新?
【发布时间】:2014-01-19 23:23:58
【问题描述】:

我正在用 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() 的工作方式?

【问题讨论】:

  • 您在哪个操作系统上运行?
  • @Charlie,32 位 Lubuntu 13.10,带有来自存储库的 SDL 2.0。
  • 我在 OSX 上遇到了类似(如果不完全相同)的问题。在我看来,该方法应该像在 Windows 上一样工作,如果不能,则应该记录差异。官方 SDL BB 上的这个帖子详细介绍了一些细节,但似乎没有真正澄清情况 - forums.libsdl.org/… - 如果您找到更多详细信息,请在此处回复!

标签: sdl joystick


【解决方案1】:

确保您按照以下步骤操作,看看您是否仍有问题:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2017-10-10
    • 1970-01-01
    • 2019-08-10
    • 2019-07-16
    • 1970-01-01
    • 2021-02-17
    相关资源
    最近更新 更多