2015-06-09 3 views
3

Мой вопрос выскочил при чтении учебников по SDL2, на lazyfoo.net и код копируется из this pageSDL2 основного цикл игры

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

Просто хотел упомянуть, что событие 'SDL_QUIT' генерируется нажатием значка' X' в правом верхнем углу окна SDL, а не нажатием клавиши Escape. – LastBlow

ответ

3

Вы визуализируете экран снова и снова, потому что обычно вещи, отображаемые на экране, меняются. Чтобы представить эти изменения, вам необходимо обновить дисплей. Например, если мяч перемещается по экрану, и вы только визуализируете экран один раз, мяч не будет перемещаться. Однако, если вы продолжаете «запускать снова и снова», вы сможете увидеть, как мяч перемещается по экрану.

+0

Я принимаю ур а ... но дайте мне знать что-то. ... y должен ли я сделать его снова n снова, если я знаю, что он не меняется .... как в моем примере его статическая текстура –

+1

Цель этого урока - показать вам, как вы можете визуализировать текстуру в таком виде приложения , теперь вы можете применять переводы или вращения и наблюдать за изменениями. Целью этих уроков является не просто визуализация текстуры и ее выполнение, а упрощение более сложной программы. Вы можете сделать это таким образом для конкретного примера, сделать один раз, но обычно графическое приложение будет продолжать рисовать. Если вы действительно любите рисовать только один раз, вы можете сделать так, чтобы приложение отображалось только в том случае, если бы произошло изменение, которое зависит от вас, как реализовать. – aslg

+2

@Sagar Kar Существует два типа рендеринга: пассивный и активный. Пассивное раздирание только отображает экран, когда ему это нужно. Этот подход обычно используется в оконных графических приложениях с элементами управления и без динамических анимированных событий. При пассивном рендеринге экран по-прежнему нуждается в обновлении, просто не на основе часов. Активный рендеринг используется в таких вещах, как видеоигры, для постоянного обновления экрана. [Здесь] (https://docs.oracle.com/javase/tutorial/extra/fullscreen/rendering.html) - хорошая статья, описывающая различия между активным и пассивным рендерингом. –

0

Учебники Lazyfoo довольно хороши, я бы сказал, придерживайтесь их.

По какой-то причине уроки по времени обновления и частоте кадров составляют 24 и 25, что, я бы сказал, немного запоздало, но они есть.

Как я уже сказал в комментарии, это Event Driven Programming. Основной цикл должен читать события, такие как нажатия клавиш и щелчки мыши, обновлять ваше приложение, используя время, прошедшее с момента последнего обновления, а затем визуализировать его. Это произойдет X раз в секунду, это частота кадров.

Этот код выполнен таким образом, чтобы он мог впоследствии подтвердить это время, но урок на этом приходит позже.

Это пример очень простой основной петли.

while (appIsRunning) { 
    handleEvents(); 

    update(deltaTime); 

    render(); 

    // If frames were 30, wait 33 ms before running the loop again 
    delay(1000/frames); 
} 
+1

Главным недостатком здесь является то, что вы не учитываете время, затрачиваемое на handleEvents()/update()/render(), что делает цикл не очень масштабируемым. Хорошим подходом было бы полагаться на текущее время. –