2017-02-14 37 views
0

Я изначально написал свою игру, используя glfw. Однако из-за отсутствия мобильности android я должен заменить весь мой код glfw на SDL, поскольку SDL более портативен.Можно ли проверить события с помощью SDL без использования встроенного while_loop?

Мой оригинальный игровой цикл, использующий работу рамы glfw, был очень плавным. Вот оно:

// game loop 
while (!glfwWindowShouldClose(window)) { 
    //if-else statements that create 
    //the games state machine 
    //player input is received here 
    //rendering done here 
} 

Ok. Есть, вероятно, лучшие способы написания этого игрового цикла, но суть в том, что код работал для прототипа игры.

Однако теперь, когда я переключаюсь на SDL, я столкнулся с проблемой. Кажется, что SDL_Event должен быть помещен в цикл while, чтобы постоянно проверять события. И ЭТО while_loop находится внутри другого while_loop. Так что мой код выглядит следующим образом:

while(!Quit) { 
    SDL_Event event; 
    while(SDL_PollEvent(&event)) { 
     //if-else statements that create 
     //the games state machine 
     //player input is received here 
     //rendering done here 
    } 
} 

Однако это while_loop в while_loop полностью перепутались игры рендеринга! Я сейчас мерцаю! Есть ли другой способ выразить этот код всего за один while_loop, как это было раньше с glfw. Или есть ли способ проверить события без использования встроенного while_loop

+4

Не следует ли 'SDL_PollEvent()' петля просто иметь дело с событиями? Ваш код рендеринга и т. Д. Должен быть вне этого, в вашем внешнем цикле ... как есть, вы только визуализируете и т. Д. При обработке события ... – Dmitri

ответ

4

Оказание и расчеты не должны выполняться внутри цикла опроса событий, делать его снаружи.

Это, как я в настоящее время сделать это в SDL2 для игры, которую я написал в :

while (!quit) { 
    start_frame_ms = SDL_GetTicks(); 

    /* Event polling */ 
    while (SDL_PollEvent(&event)) { 
     joystick_event(&event); 
     keyboard_event(&event); 
    } 

    /* Calculations */ 
    players_move(); 
    enemies_move(); 

    /* Rendering */ 
    draw_sprites(); 

    /* Lock FPS to 60 */ 
    end_frame_ms = start_frame_ms - SDL_GetTicks(); 
    if (end_frame_ms < FPMS) { 
     SDL_Delay(FPMS - end_frame_ms); 
    } 
} 
+0

Другой вариант - иметь отдельный поток для рендеринга, но это другой рассказ. – Matso

+0

@Matso Разве это не приведет к тому, что координаты из функций вычислений не будут синхронизироваться с рисованием спрайтов? – Houssni

+0

Если никакие методы синхронизации не были применены, конечно. Я просто говорю, что в больших двигателях обычно есть отдельные потоки для разных вещей (рендеринг, аудио, вход и т. Д.). – Matso

 Смежные вопросы

  • Нет связанных вопросов^_^