2012-05-08 62 views
0

我目前正在使用SDL製作遊戲,並遇到SDL未收拾某些事件的問題。對於採樣,我會按'w'前進,同時,我正在移動鼠標來環顧四周。但假設我按'a'或'd',SDL將不會選擇這些事件,或者即使當我釋放'w'時,SDL也不會拾取KEYUP事件。我首先在Windows中編寫了這段代碼,它一切正常,但切換到Ubuntu後,它不再按預期工作。這是我的主循環,我輪詢事件:SDL_PollEvent未收集所有事件

while(Running) 
{ 
    while(SDL_PollEvent(&event)) 
     Events(&event); 
    if(active){ 
     Loop(); 
     Render(); 
    } 
} 

這是)事件中的代碼(:

switch(Event->type) 
    { 
     case SDL_QUIT: 
      Running = false; 
      break; 
     case SDL_KEYDOWN: 
      switch(Event->key.keysym.sym) 
      { 
       case SDLK_ESCAPE: 
        Running = false; 
        break; 
       case SDLK_a: 
        keyStates['a'] = true; 
        break; 
       case SDLK_s: 
        keyStates['s'] = true; 
        break; 
       case SDLK_d: 
        keyStates['d'] = true; 
        break; 
       case SDLK_w: 
        keyStates['w'] = true; 
        break; 
       case SDLK_LSHIFT: 
        camera.setSpeed(2.0f); 
        break; 
      } 
      break; 
     case SDL_KEYUP: 
      switch(Event->key.keysym.sym) 
      { 
       case SDLK_a: 
        keyStates['a'] = false; 
        break; 
       case SDLK_s: 
        keyStates['s'] = false; 
        break; 
       case SDLK_d: 
        keyStates['d'] = false; 
        break; 
       case SDLK_w: 
        keyStates['w'] = false; 
        break; 
       case SDLK_LSHIFT: 
        camera.setSpeed(1.0f); 
        break; 
      } 
      break; 
     case SDL_MOUSEBUTTONDOWN: 
      switch(Event->button.button) 
      { 
       case SDL_BUTTON_MIDDLE: 
        mouse.middle = true; 
        break; 
      } 
      break; 
     case SDL_MOUSEBUTTONUP: 
      switch(Event->button.button) 
      { 
       case SDL_BUTTON_MIDDLE: 
        mouse.middle = false; 
        break; 
      } 
      break; 
     case SDL_MOUSEMOTION: 
      if(moving){ 
       camera.lookat(float(Event->motion.x - winWidth/2),float(Event->motion.y - winHeight/2), MOUSE_SENSITIVITY, dt); 
       SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); 
       SDL_WarpMouse(winWidth/2, winHeight/2); 
       SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE); 
      } 
      break; 
    } 

回答

1

keyStates [ '一'] = TRUE;

這裏有SDL_GetKeyState這個。使用它而不是手動維護數組。

Uint8 keys[SDLK_LAST]; 
Uint8* sdlKeys = SDL_GetKeyState(0); 
memcpy(keys, sdlKeys, sizeof(keys)); 

bool keyPressed(SDLKey key){ 
    return keys[key] == SDL_PRESSED; 
} 

還檢查documentation

+0

-1:鏈接到首頁並不真的會引導OP到問題的答案沒有不必要的信息。當然,這會讓他們閱讀並最終得出答案,但是有一大堆附加內容無法解決問題。 – user2738698

+0

@ user2738698:夥計。檢查問題的日期和答案。 – SigTerm

+0

那麼?它也不會幫助未來的人。大部分答案都沒有問題,首頁的鏈接無法幫助任何希望解決問題的人。 – user2738698