在阅读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;
}
我认为有一个原因,因为这在许多教程中已经完成。 但我无法理解。
答案 0 :(得分:4)
您反复渲染屏幕,因为屏幕上显示的内容通常会发生变化。要表示这些更改,您需要更新显示。例如,如果球在屏幕上移动并且您只渲染一次屏幕,则球将不会移动。但是,如果你继续一次又一次地跑步"那么你将能够看到球在屏幕上移动。
答案 1 :(得分:0)
Lazyfoo的教程非常好,我说要坚持下去。
由于某种原因,有关更新时间和帧速率的课程是24和25,我说这有点晚了,但他们就在那里。
就像我在评论中所说的那样Event Driven Programming。主循环应该读取事件,例如按键和鼠标单击,使用自上次更新以来经过的时间更新应用程序,然后呈现它。这将每秒发生X次,即帧速率。
该代码的制作方式可以在以后进行检查,但是后面的课程会在稍后进行。
这是一个非常简单的主循环的例子。
<body>