2010-10-16 61 views
1

我正在编写一个测试鼠标的简单程序。它编译好,但不起作用。当我启动它时,窗口冻结。我究竟做错了什么?SDL程序冻结

#include <SDL/SDL.h> 
#undef main 

int main() 
{ 
    if (SDL_Init (SDL_INIT_EVERYTHING) != 0) 
     return 1; 
    SDL_Surface* Scr; 
    if ((Scr = SDL_SetVideoMode (300, 200, 32, 0)) == 0) 
     return 2; 

    SDL_Rect Mouse1 = {50, 50, 50, 100}; 
    SDL_Rect Mouse3 = {150, 50, 50, 100}; 
    SDL_Rect Mouse2 = {250, 50, 50, 100}; 
    SDL_Surface Colors; 
    SDL_Rect Click = {0, 0, 50, 100}; 
    SDL_Rect NoClick = {50, 0, 50, 100}; 

    SDL_FillRect (Scr, 0, SDL_MapRGB (Scr->format, 255, 255, 255)); 
    SDL_FillRect (&Colors, &Click, SDL_MapRGB (Colors.format, 255, 0, 0)); 
    SDL_FillRect (&Colors, &NoClick, SDL_MapRGB (Colors.format, 0, 0, 255)); 

    while (true) 
    { 
     if (SDL_GetMouseState (0, 0) & SDL_BUTTON(1)) 
      SDL_BlitSurface (&Colors, &Click, Scr, &Mouse1); 
     else 
      SDL_BlitSurface (&Colors, &NoClick, Scr, &Mouse1); 

     if (SDL_GetMouseState (0, 0) & SDL_BUTTON(2)) 
      SDL_BlitSurface (&Colors, &Click, Scr, &Mouse2); 
     else 
      SDL_BlitSurface (&Colors, &NoClick, Scr, &Mouse2); 

     if (SDL_GetMouseState (0, 0) & SDL_BUTTON(3)) 
      SDL_BlitSurface (&Colors, &Click, Scr, &Mouse3); 
     else 
      SDL_BlitSurface (&Colors, &NoClick, Scr, &Mouse3); 

     if (SDL_GetKeyState (0) [SDLK_ESCAPE]) 
      return 0; 

     SDL_Delay (17); 
    } 
} 

回答

3

您没有处理任何事件。在你的情况下,调用SDL_PumpEvents使SDL处理它们并更新其所有内部状态:

while (true) 
{ 
    SDL_PumpEvents(); 

    // The rest is the same ... 
} 
+0

好吧,它帮助了freezig,但没有任何显示在屏幕上。在SDL_Delay()之前添加SDL_Flip()之后,仍然不起作用。 – Xirdus 2010-10-16 22:55:52

+0

我不知道它不会崩溃。你不应该像在'SDL_Surface Colors'中那样声明一个静态的SDL_Surface。相反,请始终使用指针(“SDL_Surface * Colors”)并使用SDL_CreateRGBSurface(http://sdl.beuc.net/sdl.wiki/SDL_CreateRGBSurface)和SDL_FreeSurface函数分配/取消分配曲面。我建议阅读SDL网站上链接的教程。 – 2010-10-16 23:04:13