2014-10-07 91 views
1

我在SDL和C++中構建了一個空間射手,該移動至今仍在運行。 問題是,如果我按下,讓我們說UP,然後添加右鍵(現在我同時向上和向右按),船停留很短時間。SDL移動停止

當它向上移動+右,同樣發生,如果我放開第二個按鍵,移動停止,我必須再次按下鍵開始。

我想它與持有和添加按鍵有關的問題。如果有人能告訴我在哪裏看,這將是很好的。

我正在使用SDL2。

Uint8 const *keystate = SDL_GetKeyboardState(NULL); 

keystate = SDL_GetKeyboardState(NULL); 
while(exit == false) { 
    if(SDL_PollEvent(&event) != 0) { 
     if(event.type == SDL_QUIT) { 
      exit = true; 
     } 
     if (keystate[SDL_SCANCODE_LEFT]) { 
      ship.move(-2, 0); 
     } 
     if (keystate[SDL_SCANCODE_RIGHT]) { 
      ship.move(2, 0); 
     } 
     if (keystate[SDL_SCANCODE_UP]) { 
      ship.move(0, -2); 
     } 
     if (keystate[SDL_SCANCODE_DOWN]) { 
      ship.move(0, 2); 
     } 
     if (keystate[SDL_SCANCODE_SPACE]) { 
      ship.shoot(); 
     } 
    } 
    SDL_BlitSurface(ship.getSurface(), NULL, surface, ship.getRect()); 
    SDL_UpdateWindowSurface(window); 
    SDL_FillRect(surface, NULL, 0); 
} 

它不是固定的類似的東西:

if (keystate[SDL_SCANCODE_DOWN] && keystate[SDL_SCANCODE_RIGHT) { 
     ship.move(2, 2); 
    } 

回答

4

SDL_PollEvent被觸發時,國家重點的變化,我相信如果你按住鍵您可以根據按鍵重複率得到事件。你應該移動鍵盤校驗碼外if(SDL_PollEvent(&event) != 0)

while(exit == false) { 
    if(SDL_PollEvent(&event) != 0) { 
     if(event.type == SDL_QUIT) { 
      exit = true; 
     } 
    } 

    // you may need to take into account elapsed time to achieve constant speed 
    // regardless of frame rate 
    if (keystate[SDL_SCANCODE_LEFT]) { 
     ship.move(-2, 0); 
    } 
    if (keystate[SDL_SCANCODE_RIGHT]) { 
     ship.move(2, 0); 
    } 
    if (keystate[SDL_SCANCODE_UP]) { 
     ship.move(0, -2); 
    } 
    if (keystate[SDL_SCANCODE_DOWN]) { 
     ship.move(0, 2); 
    } 
    if (keystate[SDL_SCANCODE_SPACE]) { 
     ship.shoot(); 
    } 

    SDL_BlitSurface(ship.getSurface(), NULL, surface, ship.getRect()); 
    SDL_UpdateWindowSurface(window); 
    SDL_FillRect(surface, NULL, 0); 
} 

讀也the doc,正確的代碼,你被明確命名有錯的代碼,例如提供。