2013-08-26 119 views
3

我一直在Xcode上使用我的Macbook上的SDL2一點點,我非常高興。最近我試圖收到重點丟失的事件,但它不起作用。經過一番修改之後,我發現沒有收到窗口事件,除了一個窗口事件,其類型爲512,以隨機間隔每秒顯示2-5次。 WindowEventID是一個枚舉,而不是十六進制格式,所以它不應該是一些十六進制數字。我在512的SDL2框架中搜索了一下,結果什麼都沒發現。其他事件,如SDL_QUITSDL_KEYDOWN工作得很好。任何人都知道發生了什麼事?SDL2沒有收到窗口事件

這裏是我的事件循環:

SDL_Event event; 

bool running = false; 
while(running) { 
    while(SDL_PollEvent(&event)) { 
     if(event.type == SDL_QUIT) 
      running = false; 

     else if(event.type == SDL_KEYDOWN) { 
      cout << event.key.type << endl; 
     } 
     else if(event.type == SDL_WINDOWEVENT) { 
      cout << event.window.type << endl; 
     } 
    } 

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); 
    SDL_RenderClear(renderer); 
    SDL_RenderPresent(renderer); 
} 
+0

'while(SDL_PollEvent(&event)){}'會消耗大量的CPU。這是一個非阻塞操作,並且在沒有事件時將保持返回false。 – UmNyobe

+0

當SDL_PollEvent第一次返回false時,while循環將退出。 – ojs

回答

8

你需要檢查event.window.event而非event.window.type,因爲類型是更通用的,有一些其他用途(代碼512是與SDL_WINDOW_INPUT_FOCUS和它引發時,你移動光標到窗口或從窗口)。所以你的代碼可能是這樣的:

while(SDL_PollEvent(&event)) { 
    switch(event.type) 
    { 
    case SDL_WINDOWEVENT: 
     switch(event.window.event) 
     { 
     case SDL_WINDOWEVENT_ENTER: 
      cout << "entered" << endl; 
      break; 

     case SDL_WINDOWEVENT_LEAVE: 
      cout << "left" << endl; 
      break; 
     } 
     break; 

    case SDL_KEYDOWN: 
     cout << "key pressed: " << event.key.keysym.sym << endl; 
     break; 
    } 
} 
+0

你是一個拯救生命的人。不能相信我在SDL網站上查看示例代碼時沒有注意到這一點。完美的作品! – Biostreem