2014-12-15 3 views
-1

SDL 2.0을 사용 중이므로 SDL_GetKeyboardState이 예상대로 작동하지 않습니다. 플레이어는 위아래로 움직여야하지만 이것은 일어나지 않습니다. SDL_GetKeyboardState가 현재 키 상태를 반환하지 않습니다.

void Movements() { 

    const Uint8 *currentKey = SDL_GetKeyboardState(NULL); // Point has to be defined once 

    if (currentKey[SDLK_w]){ 
      PlayerPaddle.y = PlayerPaddle.y+2; 
     } 

    if (currentKey[SDLK_s]){ 
      PlayerPaddle.y = PlayerPaddle.y+2; 
     } 

} 

int main(int argc, char* args[]) { 

    main_menue(); 

    bool running = true; 

    while (running == true) { 
     SDL_PollEvent(&occur); 

     if (occur.type == SDL_QUIT) { // Closes the window, if user stops running 
      running = false; 
     } 
     Movements(); 
    } 
} 

나는 또한 키의 현재 상태를 읽을 수 없습니다 여전히 PumpEvents와 이벤트 루프를 펌프하려했으나. 나는 또한이 stackoverflow ( SDL_GetKeyboardState not working) 발견했지만 거기에 대한 해결책을 찾을 도움이되지 않았다. 내가 여기서 뭔가 못 찾았 니? 나는 정말로 장님이고 오해하고 있습니까?

+2

완전한 형식으로 코드를 보지 않고도 말하기가 너무 어렵습니다. 여기에 SDL 초기화 코드가 없거나 오류 검사가 없습니다. – Zammalad

답변

0

여기에 붙여 넣을 때 SDL_Init()이라고 가정하고 다른 선언을 그냥 삭제했습니다.

먼저 올바른 색인을 사용하고 있지 않습니다. 설명한대로 in the documentation here : "이 배열의 인덱스는 SDL_Scancode values을 사용하여 얻습니다." 그러나 SDL_Keycode 값을 사용하고 있습니다.

또 다른 문제는 비 차단 SDL_PollEvent을 사용하고 각 반복마다 Movements()을 호출하고 루프에서 차단 또는 대기가 발생하지 않는 것입니다. 가능한 한 빨리 실행되는 100 % CPU를 사용하게되면 꽤 높은 y 값이됩니다 ...

SDL_GetKeyboardState이 반환하는 배열 대신 키 이벤트를 사용할 수 있습니다. occur.type이 예를 들어 SDL_KEYDOWN 인 경우 occur.key.keysym.sym은 눌린 키의 SDL_Keycode입니다. 자세한 내용은 SDL_Event 및 기타 이벤트 유형의 설명서를 참조하십시오.

또한 루프에 SDL_Delay을 추가해야합니다.

또 다른 방법은 이벤트가 발생할 때만 반환하는 SDL_WaitEvent을 사용하는 것입니다. 그런 다음 키 프레스 인 경우 이벤트를 처리합니다. 키에 따라 몇 가지 조치를 취하십시오.