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

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

УСТРОЙСТВА УПРАВЛЕНИЯ
ЧАСТЬ ЧЕТВЕРТАЯ
УСТРОЙСТВО ЕСТЬ, А ЧТО У НЕГО ВНУТРИ?

Итак, прошлый раз мы говорили о том как узнать, какие устройства управления есть в системе. Сегодня мы поговорил о том как узнать, что у нас содержится в том или ином устройстве.

Для начала нам надо создать устройстве на основе его GUID'a. Кто не помнит, что такое GUID и как его узнать рекомендую прочитать ещё раз третью статью. Устройство создаётся при помощи функции CreateDevice класса DirectInput. Функция на вход получает строковую переменную, содержащую GUID устройства, на и отдаёт экземпляр класса DirectInputDevice8.
(Важно помнить, что все созданные классы следует обязательно удалять, иначе дальнейшая работа с системой может быть затруднена)

Дальше у нас есть два варианта. Первый -- получаем количество кнопок, осей и «хаток». Всё бы хорошо, но есть одно но, оси в джойстике не обязательно идут по порядку некоторых может просто не быть. Второй -- получаем название только тех осей, которые реально есть в наличии(хотя тоже есть подвох со слайдерам, но о нём позже).

Начнём с первого. Для получения информации о устройстве на нужно создать его класс. Например так:
Set DID = DInput8.CreateDevice(“GUID_SysMouse”) ’Забыл сказать раньше, что у мыши и клавиатуры фиксированные GUID’ы, у мыши это GUID_SysMouse, у клавиатуры GUID_SysKeyboard.
Когда устройство создано, можно получить информацию о нём при помощи процедуры GetCapabilities, в которую надо передать структуру DIDEVCAPS.

DID.GetCapabilities DEVCaps ‘DEVCaps переменная стрктуры DIDEVCAPS
Структура DIDEVCAPS содержит следующие, параметры:
lAxes -- количество осей.
lButtons -- количество кнопок
lDevType -- тип устройства типы описаны константами CONST_DI8DEVICESUBTYPE(их очень много, поэтому расшифровывать не буду, кому интересно думаю сам найдёт)
lDriverVersion -- версия драйвера
lFFMinTimeResolution -- минимальное время отклика Force Feedback эффекта, в миллисекундах.
lFFSamplePeriod -- минимальное время, между следованием Force Feedback командами.
lFirmwareRevision -- Версия прошивки.
lFlags -- флаги из группы констант CONST_DIDEVCAPSFLAGS почти все относятся к Force Feedback, поэтому пока не рассматривать небудем.
lHardwareRevision -- Версия железа устройства(не пойму на кой оно надо но есть)
lPOVs -- количество «хаток»

Второй способ сложней но в отличии от первого способа мы сможем узнать не просто, в каком количестве у нас присутствуют оси, «хатки», кнопки но и узнаем за что они отвечают.
Заключается он в вызове функции GetDeviceObjectsEnum входными параметрами которой являются константы CONST_DIDFTFLAGS возвращаемый результат будет класс DirectInputEnumDeviceObjects, в котором содержатся объекты класса DirectInputDeviceObjectInstance, которые и содержат нужную нам информацию.

Набор констант CONST_DIDFTFLAGS довольно большой но нам из него нужны только:
DIDFT_AXIS -- оси
DIDFT_BUTTON -- кнопки
DIDFT_POV -- «хатки»
Константы можно объединять в получая на выходе только то что надо.
Set DEVObj = DID.GetDeviceObjectsEnum(DIDFT_AXIS Or DIDFT_BUTTON Or DIDFT_POV) ’ Получить информацию о Осях, кнопках и «хатках»

Объект DirectInputEnumDeviceObjects содержит две функции GetCount и GetItem первая возвращает количество объектов DirectInputDeviceObjectInstance, вторая позволяет получить объект DirectInputDeviceObjectInstance по его индексу.

И в тоге всех операций мы получим объект DirectInputDeviceObjectInstance который содержит нужную нам информацию, а именно(Опишу только те назначение которых понимаю):
GetFlags -- Возвращает специфичные флаги объекта из набора констант CONST_DIDEVICEOBJINSTANCEFLAGS.
GetGuidType -- Тип GUID объекта по ним можно установить, что это за объект(описание ниже)
GetName -- Имя объекта, которое задано драйвером
GetOfs -- Смещение в структуре, относительного которого хранится нужное значение(вероятно на С++ удобно использовать)

Набор констант CONST_DIDEVICEOBJINSTANCEFLAGS содержит:
DIDOI_ASPECTACCEL -- объект возвращает информацию о ускорении
DIDOI_ASPECTFORCE -- объект возвращает информацию о силовом воздействии
DIDOI_ASPECTMASK -- используется для предоставление аспектов информации показывает, что устройство может возвращать несколько аспектов
DIDOI_ASPECTPOSITION -- объект возвращает информацию о позиции
DIDOI_ASPECTVELOCITY -- объект возвращает информацию о направление
DIDOI_FFACTUATOR -- объект может иметь эффект Force Feedback примененный на нём.
DIDOI_FFEFFECTTRIGGER -- объект может переключать работающий Force Feedback эффект.
DIDOI_GUIDISUSAGE -- содержит информацию связанную с HID
DIDOI_POLLED -- если установлен то устройство нуждается в вызове метода Poll для получения данных.

Что такое GUID объекта -- это строковая информации, которая содержит, что это за объект, расшифровывать их не буду так как они так дольно понятны, но перечислить перечислю: GUID_XAxis, GUID_YAxis, GUID_ZAxis, GUID_RxAxis, GUID_RyAxis, GUID_RzAxis, GUID_Slider, GUID_Button, GUID_Key, GUID_POV, GUID_Unknown.(Стоит заметить что GUID_Key это кнопка клавиатуры, а GUID_Button это уже кнопка мыши или джойстика).

Чтобы было более понятно я написал небольшой пример который наглядно покажет как всё что я описал работает


Вот мы и осилили самую нудную, но и очень важную часть DirectInput в следующей части мы наконец получим первые данные от наших устройств. Надеюсь я вас не сильно утомил, хотя и сомневаюсь в этом :), статья выдалась очень скучной.
P.S. Если что непонятно спрашивайте в конференции, с радостью отвечу на все вопросы.
P.S.S. На флейм и оффтопик не отвечаю :)

Пример к статье: http://www.elite-games.ru/downloads/art/program/devcaps.rar
VBKesha
К началу раздела | Наверх страницы Сообщить об ошибке
Уроки для программистов - Устройства управления, ч.4
Все документы раздела: Для тех, кто хочет писать игры | Движок на OpenGL | Создание игр в Game Maker | Bump mapping | Использование Direct Input | XNA framework |


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