2014-10-07 88 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,正确的代码,你被明确命名有错的代码,例如提供。