ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX




Перемещение объектов - часть 18


Танк готов. Осталось научиться управлять им.

Контроллер танка

Большая часть кода контроллера находится в классах C3dWnd и C3dController. Чтобы создать собственный контроллер, необходимо лишь ввести новый класс, производный от CSdController, переопределить в нем функцию OnUpdate и установить новый контроллер в своем приложении. Однако перед тем, как писать функцию OnUpdate, следует распределить параметры джойстика

/b> Д1' Глава 6. Перемещение объектов в макете

по выполняемым функциям. Конфигурация, на которой я остановился, приведена в табл. 6-3.

Таблица 6-3. Управление танком

Входной параметр Параметр танка

у Скорость

х Поворот

r Поворот POV (кнопка выбора вида) Направление башни

Кнопки 3 и 4 Подъем и опускание пушки

Кнопка 1 Выстрел из пушки

Я решил использовать параметры х и г для поворотов, чтобы даже при наличии самого простого джойстика с двумя осями можно было управлять танком. Я выбрал для этого приложения джойстик SideWinder Pro — он дает более реалистичные ощущения, чем SpaceBall. К тому же кнопка выбора вида, находящаяся на рукояти джойстика, замечательно подходит для поворотов башни.

Определившись с управлением, можно писать программу. Весь код контроллера состоит из двух функций:

CTankCtrl::CTankCtrl () (

m_dGunAngle = 25;

m_bWasFire = FALSE;

}

void CTankCtrl::OnUpdate(_3DIMPUTSTATE& st, C3dFrame* pFrame) {

// Задать скорость (руководствуясь значением у)

double v = st.dY / 2;

// Определить текущее положение C3dVector pos;

pFrame-»GetPosition (pos) ;

// Получить текущий вектор направления C3dVector dir, up;

pFrairie-»GetDirection(dir, up) ;

// Определить новое направление (с учетом

// параметров х и г)

double dr = -st.dX + -st.dR;

C3dMatrix r;

r.Rotate(0, dr * 3, 0) ;

dir = r * dir;

Создание собственного контроллера движения 'т^ 159

// Умножить вектор направления на скорость, // чтобы определить смещение танка C3dVector ds = dir * v;

// Задать новое положение и направление pos += ds;

pFrame-»SetPosition (pos) ;

pFrame-»SetDirection (dir) ;




Содержание  Назад  Вперед