Самым простым способом считывания времени в Windows является использование функции timeGetTime. Эта функции не имеет параметров. Как показывает следующий код, timeGetTime просто возвращает количество миллисекунд, прошедших с момента запуска Windows.

DWORD TimeSinceStarted = timeGetTime() ;

Что полезного она делает? Обычно, функция timeGetTime вызывается один раз за кадр, обрабатываемый вашей игрой. Для каждого кадра вы вычитаете время последнего обработанного кадра из текущего времени, чтобы получить время в миллисекундах, прошедшее с предыдущего кадра. Вы можете использовать это прошедшее время для расчета вашего движения на основе времени.

Хранить время обновления последнего кадра так же просто, как и использовать статические переменные. В начале функции обновления кадра вставьте статическую переменную, хранящую текущее время.

void FrameUpdate() {

static DWORD LastTime = timeGetTime() ;

В конце функции FrameUpdate вы можете сохранить текущее время в переменной LastTime.

LastTime = timeGetTime() ;

Таким образом (записывая текущее времени в конце функции обновления кадра), вы сумели сохранить время окончания обновления кадра. В последующие вызовы FrameUpdate переменная LastTime все еще будет содержать время последнего обновления кадра. Используя это значение, вы можете вычислить количество времени, прошедшее с последнего вызова FrameUpdate, вычитая LastTime из текущего времени.

DWORD ElapsedTime = timeGetTime() - LastTime;

Именно это прошедшее время и время последнего обновления кадра вы будете использовать на протяжении всей книги. А теперь, как насчет тех случаев, когда вам необходимо вычислить количество миллисекунд, прошедших с заданного времени, например, с начала анимации, вместо того чтобы считать прошедшее время или время с первого вызова функции FrameUpdate?

Так же как вы использовали статическую переменную для хранения времени последнего обновления кадра, вы можете хранить время первого вызова функции. Используя статическую переменную, вы можете определить, сколько миллисекунд прошло с момента первого вызова функции.

void FrameUpdate()

{

static DWORD StartTime = timeGetTime() ;

DWORD ElapsedTime = timeGetTime() - StartTime;

// Е1арвебТ1те - количество миллисекунд,прошедших с первого вызова

// функции Ргатеирбаге.

}

Таким же образом, как вышеприведенный код отслеживал количество времени, прошедшее с первого вызова функции ЕгатеИрсМе, можно встроить время начала анимации в свои структуры данных. Вы сможете узнать об этом больше в главе 5 "Использование скелетной анимации на основе ключевых кадров".

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

Использование движения, синхронизированного по времени || Оглавление || Анимирование с использованием временных меток