2014-01-19 162 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不會更新操縱桿的數量或熱插拔事件
    • 當您在主線程外泵送時,其他操縱桿事件仍然有效,但不推薦使用。
  • 相關問題