Введение в программирование трехмерных игр с DX9

Окно программы, рассматриваемой в этой главе



Рисунок 12.8. Окно программы, рассматриваемой в этой главе


Вы можете свободно перемещаться по сцене, используя следующие клавиши:

W/S — передвижение вперед и назад;

A/D — сдвиг влево и вправо;

R/F — полет вверх и вниз;

Стрелки вверх/вниз — наклон камеры;

Стрелки влево/вправо — рыскание камеры;

N/M — вращение камеры.

Реализация примера тривиальна, поскольку вся работа выполняется внутри класса Camera, о котором мы уже говорили. В функции Display мы обрабатываем нажатие клавиш согласно их назначению. Учтите, что мы в начале программы создаем глобальный объект камеры TheCamera. Также обратите внимание, что перемещение камеры синхронизируется по прошедшему с прошлого кадра времени (timeDelta); благодаря этому скорость перемещения не зависит от частоты кадров.

bool Display(float timeDelta) { if(Device) { // // Обновление сцены: перемещение камеры // if(::GetAsyncKeyState('W') & 0x8000f) TheCamera.walk(4.0f * timeDelta);

if(::GetAsyncKeyState('S') & 0x8000f) TheCamera.walk(-4.0f * timeDelta);

if(::GetAsyncKeyState('A') & 0x8000f) TheCamera.strafe(-4.0f * timeDelta);

if(::GetAsyncKeyState('D') & 0x8000f) TheCamera.strafe(4.0f * timeDelta);

if(::GetAsyncKeyState('R') & 0x8000f) TheCamera.fly(4.0f * timeDelta);

if(::GetAsyncKeyState('F') & 0x8000f) TheCamera.fly(-4.0f * timeDelta);

if(::GetAsyncKeyState(VK_UP) & 0x8000f) TheCamera.pitch(1.0f * timeDelta);

if(::GetAsyncKeyState(VK_DOWN) & 0x8000f) TheCamera.pitch(-1.0f * timeDelta);

if(::GetAsyncKeyState(VK_LEFT) & 0x8000f) TheCamera.yaw(-1.0f * timeDelta);

if(::GetAsyncKeyState(VK_RIGHT) & 0x8000f) TheCamera.yaw(1.0f * timeDelta);

if(::GetAsyncKeyState('N') & 0x8000f) TheCamera.roll(1.0f * timeDelta);

if(::GetAsyncKeyState('M') & 0x8000f) TheCamera.roll(-1.0f * timeDelta);

// Обновление матрицы вида согласно новому //местоположению и ориентации камеры D3DXMATRIX V; TheCamera.getViewMatrix(&V); Device->SetTransform(D3DTS_VIEW, &V);



Содержание раздела