2017-11-21 19 views
0

私は2つの異なるOSを実行する2台のマシンでこれを試しました。同じことがそれらの間で起こります。奇妙な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 
} 

正しいイベント処理は、ループ内で行われています