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

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

УСТРОЙСТВА УПРАВЛЕНИЯ
ЧАСТЬ ПЯТАЯ
ПОЛУЧАЕМ ДАННЫЕ ОТ УСТРОЙСТВА

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

Для того чтобы получить дынные от одного из устройств.
1. Создать объект устройства с помощью функции CreateDevice (смотрите часть 4).
2. Установить режим совместной работы.
3. Установить тип получаемых данных.
4. Захватить управление.
5. Получить данные от устройства.
6. Повторять пункт 5 столько раз сколько нам необходимо.
7. Освободить устройство.

Первый пункт я опускаю, так как он описан в прошлой статье. Поэтому перейдём сразу ко второму пункту. Что же такое режим совместной работы? Так как Windows у нас система многозадачная, то на выбранное нами устройство могут претендовать несколько программ, и от режима совместной работы зависит, будет ли доступно устройство другим программам. Устанавливается режим функцией SetCooperativeLevel объекта DirectInputDevice8 функция принимает два параметра первый это хендэл окна(hWnd), второй это два флага из CONST_DISCLFLAGS флагов 5.
DISCL_BACKGROUND — Приложение будет получать данные даже если неактивно.
DISCL_FOREGROUND — Приложение получает данные только если оно активно.
DISCL_EXCLUSIVE — Приложение имеет эксклюзивный доступ к устройству, другие приложения не имеет доступ к данным устройства, за исключением нескольких случаем с клавиатурой.
DISCL_NONEXCLUSIVE — Другие приложения могут получить данные от этого же устройства и могут даже захватить его для использования в эксклюзивный режим.
DISCL_NOWINKEY — Windows кнопки передаются в приложение в обход системы, данный флаг уместен только для клавиатуры.

Доступны следующие комбинации флагов: DISCL_EXCLUSIVE or DISCL_FOREGROUND, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND or DISCL_NOWINKEY, DISCL_NONEXCLUSIVE or DISCL_BACKGROUND. В данном случае операция or работает как битовая операция то есть флаги складываются.

Пункт третий установить тип получаемых данных, как я уже говорил для системы различимы только 3 вида устройств. Для каждого из устройств есть свой тип данных. Устанавливается он функцией SetCommonDataFormat объекта DirectInputDevice8, принимает он одну из констант CONST_DICOMMONDATAFORMATS. Этот набор включает в себя следующие константы:
DIFORMAT_KEYBOARD — Данные от клавиатуры до 256 кнопок
DIFORMAT_MOUSE — Данные от мыши 3 оси до 4 кнопок
DIFORMAT_MOUSE2 — Расширенные данные мыши 3 оси до 8 кнопок
DIFORMAT_JOYSTICK — Данные джойстика 8 осей, 4 хатки, 32 кнопки
DIFORMAT_JOYSTICK2 — Расширенные данные джойстика добавлены разные типы осей каждой из 8, также 4 хатки, и до 128 кнопок.

Пункт четвёртый захватить устройство тут всё просто, вызываем функцию Acquire объекта DirectInputDevice8.


Пункт пятый получить данные от устройства, тут фигурируют 5 функций GetDeviceStateKeyboard, GetDeviceStateMouse, GetDeviceStateMouse2, GetDeviceStateJoystick, GetDeviceStateJoystick2. Всё это функции объекта DirectInputDevice8.Как вы наверное догадались каждой из этих функций соответствует свой тип данных. К этим типа относятся структуры соответственно DIKEYBOARDSTATE, DIMOUSESTATE, DIMOUSESTATE2, DIJOYSTATE, DIJOYSTATE2. Использовать эту функцию очень просто, достаточно передать её соответствующую структуру а после этого, прочитать данные из этой же структуры.

Пункт шесть очень сложен поэтому попробуйте разобраться сами :)

Пункт седьмой по сложности равен пункту номер четыре. Вызываем функцию Unacquire объекта DirectInputDevice8.

Как всегда я набрасал пример:

Исподники читать как пример не более.
Взять можно тут: http://www.elite-games.ru/downloads/art/program/devdata.rar

Вот мы и научились получать данные из устройства. Но это один способ из двух. Зачем тогда нужен второй? А вот зачем тогда второй способ, а вот зачем наш способ плох тем, что мы должны сами опрашивать устройство и делать это мы должны довольно часто, иначе программа начнёт пропускать нажатие кнопок и движения мыши. Для преодоления этих неудобств и существует второй способ, суть его в том, что он будет вызывать нужную функцию, при каждом изменении состояния.

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

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


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