SDL2主要游戏循环

时间:2015-06-09 17:27:43

标签: c++ rendering sdl sdl-2

在阅读lazyfoo.net上的SDL2教程时,我的问题突然出现,代码正在从this page复制

int main( int argc, char* args[] )
{

//Start up SDL and create window

if( !init() )
{
    printf( "Failed to initialize!\n" );
}
else
{
    //Load media
    if( !loadMedia() )
    {
        printf( "Failed to load media!\n" );
    }
    else
    {
        //Main loop flag
        bool quit = false;

        //Event handler
        SDL_Event e;

        //While application is running
        while( !quit )
        {
            //Handle events on queue
            while( SDL_PollEvent( &e ) != 0 )
            {
                //User requests quit
                if( e.type == SDL_QUIT )
                {
                    quit = true;
                }
            }

            //Clear screen
            SDL_RenderClear( gRenderer );

            //Render texture to screen
            SDL_RenderCopy( gRenderer, gTexture, NULL, NULL );

            //Update screen
            SDL_RenderPresent( gRenderer );
        }
    }
}

//Free resources and close SDL
close();

return 0;
}

这里我们为什么要在主循环中渲染效果并让它一次又一次地运行而不是像:

int main( int argc, char* args[] )
{
//Start up SDL and create window
if( !init() )
{
    printf( "Failed to initialize!\n" );
}
else
{
    //Load media
    if( !loadMedia() )
    {
        printf( "Failed to load media!\n" );
    }
    else
    {
        //Main loop flag
        bool quit = false;

        //Event handler
        SDL_Event e;

       //Clear screen
       SDL_RenderClear( gRenderer );

        //Render texture to screen
        SDL_RenderCopy( gRenderer, gTexture, NULL, NULL );

        //Update screen
        SDL_RenderPresent( gRenderer );

        //While application is running
        while( !quit )
        {
            //Handle events on queue
            while( SDL_PollEvent( &e ) != 0 )
            {
                //User requests quit
                if( e.type == SDL_QUIT )
                {
                    quit = true;
                }
            }
        }
    }
}

//Free resources and close SDL
close();

return 0;
}

我认为有一个原因,因为这在许多教程中已经完成。 但我无法理解。

2 个答案:

答案 0 :(得分:4)

您反复渲染屏幕,因为屏幕上显示的内容通常会发生变化。要表示这些更改,您需要更新显示。例如,如果球在屏幕上移动并且您只渲染一次屏幕,则球将不会移动。但是,如果你继续一次又一次地跑步"那么你将能够看到球在屏幕上移动。

答案 1 :(得分:0)

Lazyfoo的教程非常好,我说要坚持下去。

由于某种原因,有关更新时间和帧速率的课程是24和25,我说这有点晚了,但他们就在那里。

就像我在评论中所说的那样Event Driven Programming。主循环应该读取事件,例如按键和鼠标单击,使用自上次更新以来经过的时间更新应用程序,然后呈现它。这将每秒发生X次,即帧速率。

该代码的制作方式可以在以后进行检查,但是后面的课程会在稍后进行。

这是一个非常简单的主循环的例子。

<body>