2016-03-03 75 views
-1

非常簡單的程序,用於在屏幕上繪圖(如使用筆中的Paint)SDL_PollEvent()跳過事件

我正在使用SDL 1.2。只有我正在處理的事件是鼠標移動,鼠標左鍵單擊和退出程序。我的問題是SDL_MOUSEMOTION事件被「跳過」當我移動鼠標快速(當我說快我的意思是快於1個像素/秒)

爲什麼出現這種情況?

屏幕截圖:

http://postimg.org/image/gcb87v9zr/

http://postimg.org/image/i5e4w6v6f/

#include <SDL/SDL.h> 

SDL_Event event; 
SDL_Surface* screen; 
bool clicked = false; 
Uint32 whiteColor; 
int W = 200; // screen width 
int H = 200; // screen height 
Uint32* screenPixels; 

bool handleInput(); 

int main(int argc, char** argv) 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 
    screen = SDL_SetVideoMode(W,H,32,SDL_SWSURFACE); 
    whiteColor = SDL_MapRGB(screen->format,255,255,255); 

    screenPixels = (Uint32*) screen->pixels; 

    while(handleInput()) 
    { 

    } 
    SDL_Quit(); 
    return 0; 
} 

bool handleInput() 
{ 
    while(SDL_PollEvent(&event)) 
    { 
     switch(event.type) 
     { 
      case SDL_QUIT:{ 
       return false; 
       break; 
      } 
      case SDL_MOUSEBUTTONDOWN:{ 
       clicked = true; 
       break; 
      } 
      case SDL_MOUSEBUTTONUP:{ 
       clicked = false; 
       break; 
      } 
      case SDL_MOUSEMOTION:{ 
       if(clicked) 
       { 
        int P_x = event.motion.x; 
        int P_y = event.motion.y; 
        screenPixels[P_y * W + P_x] = whiteColor; 
        SDL_Flip(screen); 
       } 
       break; 
      } 
     } 
    } 
    return true; 
} 

回答

1

這是因爲你SDL_Flip所有你的屏幕,它需要太多的時間。

在另一個線程(例如使用std::async)中更好地調用SDL_Flip

或者你可以更新不是所有的表面,而是僅改變顏色爲白色的部分。

+0

是的,SDL_Flip()是原因,當我只打印實例的座標時,SDL_PollEvent()工作正常 – marko

+0

@marko因此,您不得在事件輪詢器線程中執行任何昂貴的操作。另外一個建議可以在並行線程n毫秒做一次SDL_Flip。 – vladon