为什么Mac OS上的SDL2程序窗口没有响应?

4

我刚在我的 Mac 上安装了 SDL2 框架,但是虽然编译和运行程序都成功了,但窗口没有响应(我复制了创建一些矩形的代码)。

我使用的是 Xcode,并且按照这里的教程http://lazyfoo.net/tutorials/SDL/01_hello_SDL/mac/xcode/index.php一步一步地操作。

SDL_Window* window = NULL;

//The surface contained by the window
SDL_Surface* screenSurface = NULL;

//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
    printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
}
else
{
    //Create window
    window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
    if( window == NULL )
    {
        printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
    }
    else
    {
        //Get window surface
        screenSurface = SDL_GetWindowSurface( window );

        //Fill the surface white
        SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );

        //Update the surface
        SDL_UpdateWindowSurface( window );
        cout << " Ok" << endl;
        //Wait two seconds
        SDL_Delay( 20000 );
    }
}

//Destroy window
SDL_DestroyWindow( window );

//Quit SDL subsystems
SDL_Quit();

return 0;

为什么会出现这个问题? 非常感谢。

4
SDL_Delay(20000) 表示窗口会冻结 20 秒。你应该添加一个消息循环。 - user7860670
是的,我增加了20秒钟来确认一切是否正常工作,但当这个窗口打开时,会出现一个提示,指出程序未响应。 - Quel' Thas
但在控制台中一切都正常...或者您的意思是它将不响应20秒? - Quel' Thas
1
程序无响应,因为没有消息循环来处理操作系统消息和其他内容。您应该添加一个使用 SDL_PollEvent 的消息循环,如此处所示 https://wiki.libsdl.org/SDL_PollEvent。 - JustSomeGuy
是的,程序在这20秒内不会响应。 - user7860670
哦,非常感谢,一切都正常工作!;) - Quel' Thas
1个回答

3
为了让使用SDL编写的程序“响应”操作系统,您需要将控制权交还给SDL以处理系统消息并将其作为SDL事件返回给您(例如鼠标事件、键盘事件等)。
为此,您需要添加一个循环,使用SDL_PollEvent,应该如下所示。
while(true)
{
    SDL_Event e;
    while (SDL_PollEvent(&e)) 
    {
        // Decide what to do with events here
    }

    // Put the code that is executed every "frame". 
    // Under "frame" I mean any logic that is run every time there is no app events to process       
}

有一些特殊事件,例如SDL_QuiEvent,您需要处理它们以关闭应用程序。如果您想要处理它,您应该修改您的代码,使其类似于以下内容:

while(true)
{
    SDL_Event e;
    while (SDL_PollEvent(&e)) 
    {
        if(e.type == SDL_QUIT)
        {
            break;
        }
        // Handle events
    }

    // "Frame" logic     
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接