Код этого урока взят из предидущего.

Цель урока — показать способ реализации time-based движения. Это означает, что скорость движения камеры будет одинаковой на любой машине, независимо от процессора или видеокарты. То есть если на определённой машине кадры будут отрисовыватся быстрее, игрок все равно не попадет из точки А в точку B быстрее, чем другой игрок. Без time-based движения человек, например, с GForce2 будет двигаться на порядок быстрее человека с Riva TNT.

Итак, изменения коснутся только файла camera.cpp:

// Увеличим скорость до 5
#define kSpeed 5.0f// Обьявим глобальную переменную, интервал времени с последнего кадра
float g_FrameInterval = 0.0f;// И напишем новую функцию:
///////////////////////////////// GET FRAME TIME \\\\\\\\\\\\\\\\*
/////
/////           Вычисляет время с последнего кадра
/////
///////////////////////////////// GET FRAME TIME \\\\\\\\\\\\\\\\*void GetFrameTime()
{
static float frameTime = 0.0f;  // Время последнего кадраfloat currentTime = timeGetTime() * 0.001f;

// Интервал времени, прошедшего с прошлого кадра
g_FrameInterval = currentTime frameTime;

frameTime = currentTime;
}

// Вносим изменения в функцию CheckForMovement().
void CCamera::CheckForMovement()
{
// Теперь, имея интервал времени, прошедший с последнего кадра, в начале функции
// мы получаем необходимую скорость умножением скорости на интервал времени:
float speed = kSpeed * g_FrameInterval;

// И дальше во всех вызовах заменяем «kSpeed» на «speed».
// Например:
if(GetKeyState(VK_UP) & 0x80 || GetKeyState(‘W’) & 0x80) {
MoveCamera(speed);
}
//…………………….
}

// И наконец, в самый конец функции CCamera::Update() добавьте вызов:
GetFrameTime();

 

Это, наверное, самый простой из всех уроков, но один из самых важных.
Ещё раз повторю: подобная проверка обязана быть в любом движке.

Исходные коды к уроку