Ограничение скорости кадров
Что может работать на вашем компьютере на скорости 60 кадров в секунду, на другом может работать на 200. Так как скорость меняется от компьютера к компьютеру, вам необходимо регулировать фреймрейт (скорость кадров), для того, чтобы игра не работала слишком быстро. Если игра работает слишком быстро, в нее становится невозможно играть. Для предотвращения этого, вам нужно ограничить скорость кадров. Этот урок научит вас этому.
//Кадров в секунду
const int FRAMES_PER_SECOND = 20;
Мы определяем количество кадров в секунду как глобальную константу.
//Количество отрисованных кадров
int frame = 0;
//Ограничивать ли фреймрейт (количество кадров в секунду)
bool cap = true;
//Таймер для регулирования фреймрейта
Timer fps;
В функции main()
мы объявляем несколько переменных. Переменная frame
хранит количество отрисованных кадров, что важно для определения положения, в котором нужно отрисовать сообщение в этой программе. Так же тут есть переменная cap
, которая определяет, хочет ли пользователь ограничивать фреймрейт. Затем мы объявляем объект таймера, который мы используем для ограничения фреймрейта.
//Генерируем поверхность с сообщением
message = TTF_RenderText_Solid( font, "Testing Frame Rate", textColor );
Теперь мы рендерим поверхность с сообщением, которая будет двигаться по экрану.
//Пока пользователь не вышел
while( quit == false )
{
//Запускаем таймер
fps.start();
Далее мы входим в главный цикл. В начале каждого кадра мы запускаем таймер кадра.
//Пока есть события для обработки
while( SDL_PollEvent( &event ) )
{
//Если нажали клавишу
if( event.type == SDL_KEYDOWN )
{
//Если нажали ввод
if( event.key.keysym.sym == SDLK_RETURN )
{
//Switch cap
cap = ( !cap );
}
}
//Если пользователь вышел
else if( event.type == SDL_QUIT )
{
//Выйти
quit = true;
}
}
Здесь мы обрабатываем события. По существу, мы включаем/выключаем ограничение фреймрейта, когда пользователь нажимает enter
, и выходим из программы при наступлении соответствующего события. Обычно, вам не требуется переменная для включение/выключения ограничения фреймрейта в настоящей игре, но здесь, в нашей программе, она есть, для того чтобы вы могли видеть разницу между регулируемым и нерегулируемым фреймрейтом.
//Отрисовать фон
apply_surface( 0, 0, background, screen );
//Отрисовать сообщение
apply_surface(
( SCREEN_WIDTH - message->w ) / 2,
( ( SCREEN_HEIGHT + message->h * 2 ) / FRAMES_PER_SECOND ) *
( frame % FRAMES_PER_SECOND ) - message->h,
message,
screen
);
Затем мы отрисовываем фон и сообщение. Не беспокойтесь обо всем этом коде, рисующем сообщение. Это просто более короткий спобоб записи для:
if( frame % FRAMES_PER_SECOND == 0 )
{
//Отрисовать тут
}
if( frame % FRAMES_PER_SECOND == 1 )
{
//Отрисовать тут
}
И т.д.
//Обновить экран
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
//Увеличить количество отрисованных кадров
frame++;
Далее мы обновляем экран и увеличиваем счетчик кадров. Теперь мы закончили все, что нужно было сделать в этом кадре.
//Если мы хотим ограничить фреймрейт
if( ( cap == true ) && ( fps.get_ticks() < 1000 / FRAMES_PER_SECOND ) )
{
//Ждем оставшееся время
SDL_Delay( ( 1000 / FRAMES_PER_SECOND ) - fps.get_ticks() );
}