2014-01-19 164 views
3

我正在用C语言编写一个利用SDL 2.0的小程序,并且在我无法获得SDL_NumJoysticks()报告函数调用时插入的游戏杆数量时遇到了问题。我相信它报告的是在SDL的一个初始化函数中连接的游戏杆的数量(我猜'SDL_Init()',但我没有证据),然后在整个程序的其余部分继续给你这个数字。这里是我一直在用一个短的测试程序:为什么SDL_NumJoysticks()永远不会更新?

#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()的工作方式?

+0

你在哪个操作系统上运行? – Charlie

+0

@Charlie,来自存储库的32位Lubuntu 13.10库存SDL 2.0。 – fouric

+0

我在OSX上遇到了类似的问题(如果不完全一样)。我看到它的方式应该像在Windows上一样工作,如果没有,应该记录差异。官方SDL BB上的这个主题涉及了一些细节,但似乎并没有真正说明情况 - http://forums.libsdl.org/viewtopic.php?t=9592&sid=f1468617007f482a33de58d62234405f - 如果您发现更多细节,请回到这里! – Charlie

回答

3

确保您按照这些步骤,看看您是否仍然有问题:

SDL_INIT
    • 呼叫SDL_JoystickEventState(SDL_ENABLE)如果这还不够,尝试通过调用SDL_JoystickUpdate强制进行更新() ;前一段时间(SDL_PollEvent(&事件))

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

    • 总是在主线程和其他地方SDL_PeepEvents呼吁SDL_PollEvent在主线程(或SDL_PumpEvents() )
    • 如果您不这样做,SDL不会更新操纵杆的数量或热插拔事件
    • 当您在主线程外泵送时,其他操纵杆事件仍然有效,但不推荐使用。
  • 相关问题