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



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


Устройство ввода от мыши выглядит несколько проще. Поскольку мышь обладает только двумя степенями свободы, необходимо определить, каким образом два входных параметра отображаются на шесть выходных осей (табл. 6-2).

Таблица 6-2. Управляющие функции мыши

Входной параметр Normal Shift Ctrl

X X -V -U

Y -Y -Z -R

/b> iiisi^ Глава б. Пепемешение объектов в макете

Обратите внимание на то, что некоторые параметры инвертируются. Я изменил направление осей, чтобы управление стало более логичным. Код устройства ввода от мыши состоит из двух функций: C3dMouselnDev::OnUserEvent и C3dMouselnDev::GetState. Первая функция, исходный текст которой приведен ниже, находится в файле 3dlnpDev.cpp. Данная функция обрабатывает перемещение мыши и захватывает ее указатель (то есть ограничивает его перемещение текущим окном) при нажатии левой кнопки:

void C3dMouseInDev::OnUserEvent(HWND hWnd, UINT uiMsg,

WPARAM wParam, LPARAM IParam) (

switch (uiMsg) { case WM_LBUTTONDOWN:

::SetCapture(hWnd) ;

m_bCaptured = TRUE;

break;

case WM_LBUTTONUP:

if (m_bCaptured) { ::ReleaseCapture () ;

m_bCaptured = FALSE;

} break;

case WM_MOUSEMOVE:

if (m_bCaptured) (

// Внимание: экранные координаты! (см. C3dWnd)

m_ptCur.x = LOWORD(IParam);

m_ptCur.y = HIWORD(IParam);

m_dwFlags = wParam;

} break;

default:

break;

}

\ i

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

BOOL C3dMouseInDev::GetState(_3DINPUTSTATE& st) {

if (m_ptPrev.x « 0) { m_ptPrev = m_ptCur;

}

Устоойство ввода '"SH 139

if (m_dwFlags & MK_SHIFT) {

m_st.dz = -d;

} else if (m_dwFlags & MK_CONTROL) {

rri_st.dR = -d;

} else (

m_st.dY = -d;

) )

m_ptPrev = m_ptCur;

st = m_st;

return TRUE;

Функция обрабатывает полученные значения х и у таким образом, чтобы обеспечить небольшую «мертвую зону» для малых смещений и предотвратить случайное перемещение объекта. Затем смещения умножаются на коэффициент пропорциональности, чтобы перемещение объектов всегда происходило в правильном масштабе. Наконец, в зависимости от текущего состояния клавиш Shift и Ctrl функция определяет, какие выходные параметры следует изменить.




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