В любой без исключения игре необходимо контролировать время! Это без преувеличения одина из самых важных частей игровой программы.
Основой для нашего таймера станет функция библиотеки SDL — SDL_GetTicks(), которая возвращает число миллисекунд с начала инициализации библиотеки.
Создадим класс:
class Timer{ private: //время запуска таймера int startTicks; //время паузы таймера int pausedTicks; //статус таймера bool paused; bool started; public: //конструктор по умолчанию Timer(); //методы старта, остановки, паузы и !паузы.. void start(); void stop(); void pause(); void unpause(); //вернёт время таймера int get_ticks(); //проверяют статус таймера bool is_started(); bool is_paused(); };
Как видите наш таймер будет уметь всё, что и реальный.
Теперь приступим к реализации:
- конструктор:
Timer::Timer(){ startTicks = 0 pausedTicks = 0; paused = false; started = false; }
- Метод старта:
void Timer::start(){ started = true; // флаг о начале работы paused = false; /// выключаем паузу startTicks = SDL_GetTicks(); // время начала }
- Остановка таймера:
void Timer::stop(){ started = false; paused = false; }
- Пауза:
void Timer::pause(){ if( ( started == true ) && ( paused == false ) ){ // если таймер работал paused = true; /// устанавливаем флаг паузы pausedTicks = SDL_GetTicks() - startTicks; // запоминаем время работы до паузы } }
Отмена паузы:
void Timer::unpause(){ if( paused == true ){ // если таймер на паузе paused = false; // меняем флаг startTicks = SDL_GetTicks() - pausedTicks; // устанавливаем новое время начала работы pausedTicks = 0; } }
- Возвращает время работы:
int Timer::get_ticks(){ if( started == true ){ if( paused == true ){ return pausedTicks; } else { return SDL_GetTicks() - startTicks; } } return 0; }
Проверка состояния таймера:
bool Timer::is_started(){ return started; } bool Timer::is_paused(){ return paused; }
Вот так просто реализовывается самый обыденный таймер.