【问题标题】:Why mac os sdl2 program window is not responding?为什么mac os sdl2程序窗口没有响应?
【发布时间】:2019-03-25 14:54:30
【问题描述】:

我刚刚在我的 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;

为什么会出现这个问题? 提前谢谢你

【问题讨论】:

  • SDL_Delay( 20000 ) 是 20 秒的冻结窗口。您应该添加一个消息循环。
  • 是的,我添加了 20 秒以了解一切是否正常,但是当此窗口打开时,会显示程序没有响应的铭文
  • 但是在控制台中一切都很好......或者你的意思是它会在 20 秒内没有响应?
  • 程序没有响应,因为没有处理操作系统消息和其他内容的消息循环。您应该使用SDL_PollEvent 添加一个,如此处所示wiki.libsdl.org/SDL_PollEvent
  • 是的,程序在这 20 秒内没有响应。

标签: c++ sdl


【解决方案1】:

为了让 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     
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2021-08-09
    • 2011-11-19
    相关资源
    最近更新 更多