2017-11-21 2 views
0

그래서 두 개의 다른 OS를 실행하는 두 대의 컴퓨터에서이 작업을 시도했으며 두 작업간에 동일한 문제가 발생했습니다.이상한 SDL 키보드 문제

#include <iostream> 
#include <SDL2/SDL.h> 

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

bool running = true; 

SDL_Init(SDL_INIT_EVERYTHING); 

SDL_Window* win = SDL_CreateWindow("test", 100, 100, 800, 600, 
SDL_WINDOW_SHOWN); 
SDL_Renderer* ren = SDL_CreateRenderer(win, -1, 0); 

int r = 0; 

while(running) 
{ 
    SDL_Event event; 
    SDL_PollEvent(&event); 

    switch(event.type) 
    { 
     case SDL_QUIT: 
      running = false; 
      break; 

     case SDL_KEYDOWN: 
      switch(event.key.keysym.sym) 
      { 
       case SDLK_d: 
        r++; 
        break; 
       case SDLK_RIGHT: 
        r++; 
        break; 
      } 
      break; 
    } 

    SDL_SetRenderDrawColor(ren, r, 255, 255, 255); 
    SDL_RenderClear(ren); 

    SDL_RenderPresent(ren); 
} 

SDL_DestroyRenderer(ren); 
SDL_DestroyWindow(win); 
SDL_Quit(); 

return 0; 
} 

오른쪽 화살표 키를 누르면 깜박 거리며 r은 훨씬 빠르게 증가합니다.

d를 누르고 있으면 천천히 증가합니다.

왜?

답변

3

SDL_PollEvent은 보류중인 이벤트가 있으면 1을 반환하고 사용 가능한 이벤트가없는 경우 0을 반환합니다. 이유가없는 경우에도 반환 상태를 확인하지 않고 어쨌든 이벤트를 조사합니다. 여기에서 찾을 수있는 내용은 거의 정의되지 않습니다 (대부분의 경우 오래된 데이터 - 반복적으로 발생하지는 않더라도 같은 이벤트를 반복해서 읽음).

while(running) { 
    SDL_Event ev; 
    while(SDL_PollEvent(&ev)) { 
     // process event here 
    } 
    // draw here 
} 
:

올바른 이벤트 처리 루프 내에서 이루어집니다