Elite Games - Свобода среди звезд!

Уроки для программистов - Устройства управления, ч.6

УСТРОЙСТВА УПРАВЛЕНИЯ
ЧАСТЬ ШЕСТАЯ
ПУСТЬ УСТРОЙСТВО САМО СКАЖЕТ, КОГДА ПОЛУЧАТЬ ДАННЫЕ

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

На выручку приходит второй способ получения данных, суть его в том, что DirectInput будет генерировать событие о том, что произошло изменения данных в устройстве управления.

Для того чтобы получить такой результат на первым делом надо разрешить получение событий от DirectX для чего на VB надо использовать директиву Implements DirectXEvent8 которую надо добавить в секцию глобальных объявлений в коде формы. Этим мы сказали, что можем готовы принимать события от DirectX, именно от DirectX, а не конкретно от DirectInput. После этого нам надо написать процедуру, которую DirectX и будет вызывать при появлении события:

Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)
End Sub


Теперь все события DirectX будут вызывать срабатывание этой функции. Теперь нам надо создать события делается это функцией CreateEvent(event As DirectXEvent8) объекта DirectX, которой в качестве параметра надо передать объект формы, для которой подключены события DirectX. Функция вернёт хэндэл созданного события. Если вы посмотрите описания процедуры DirectXEvent8_DXCallback то увидите, что там в качестве входного параметра фигурирует eventide так вот этот параметр и будет указывать событие которое произошло. То есть, допустим у нас есть мышь, клавиатура и джойстик, нам нужно будет создать 3 события и связать каждое событие со своим устройством после чего мы сможем по хэндэлу передаваемому через eventide узнать какое из устройство изменило своё состояние. Удаляется событие с подошью процедуры DestroyEvent(eventid As Long) объекта DirectX, процедура принимает в качестве параметра хэндэл события.

Дальше нам надо связать наш хэндэл с объектом устройства, делается это процедурой SetEventNotification объекта DirectInputDevice8. Сделать это надо до захвата устройства функцией Acquire. Вот и почти всё, теперь любое действие, произведенное над устройством, будет автоматически вызывать процедуру DirectXEvent8_DXCallback, и нам теперь не придётся лишний раз глядеть что сделал пользователь.

Почему почти? Потому как есть одна вещь которую я не освятил в “пятой части (http://www.elite-games.ru/art/program/dxinput5.shtml)” из за которой некоторые устройства не хотели возвращать информацию. В “четвертой части (http://www.elite-games.ru/art/program/dxinput4.shtml)” в описании флагов есть такой флаг как DIDOI_POLLED, он говорит о том что устройство нуждается в вызове процедуры Poll перед получение данных из него. Так вот если не вызывать эту функцию для устройств в ней нуждающихся, они будут возвращать данные которые в них сохранились на момент последнего вызова процедуры Poll, а в случае с нашим случаем не будет вызываться и функция обработки событий. Вызов этой функции для устройств не нуждающейся в ней просто игнорируется. Но по некоторым причинам которые я раскрою в последней статье лучше вызывать эту функцию для всех устройств регулярно, например, в основном цикле игры.

Пример к статье: http://www.elite-games.ru/downloads/art/program/devdata2.rar

P.S. Всё вопросы и пожелания задавайте в конференции.
VBKesha
К началу раздела | Наверх страницы Сообщить об ошибке
Уроки для программистов - Устройства управления, ч.6
Все документы раздела: Для тех, кто хочет писать игры | Движок на OpenGL | Создание игр в Game Maker | Bump mapping | Использование Direct Input | XNA framework |


Дизайн Elite Games V5 beta.18
EGM Elite Games Manager v5.17 02.05.2010