Почему окно программы Mac OS SDL2 не отвечает? - PullRequest
2 голосов
/ 25 марта 2019

Я только что установил каркас SDL2 на моем Mac, но, хотя компиляция и запуск программы завершаются успешно, окно не отвечает (я скопировал код, который создает какой-то прямоугольник).

Я использую 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;

Почему может возникнуть такая проблема?Заранее спасибо

1 Ответ

0 голосов
/ 25 марта 2019

Чтобы программа, написанная 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     
}
...