Новости | Конференция | Чат | База данных | Творчество | Сообщество | О сайте | English | Помощь сайту |
УСТРОЙСТВА УПРАВЛЕНИЯ ЧАСТЬ ПЯТАЯ ПОЛУЧАЕМ ДАННЫЕ ОТ УСТРОЙСТВА Итак, пришло время получить данные от нашего устройства. Есть два способа получения данных от устройства, их можно назвать 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. Всё вопросы и пожелания задавайте в конференции.
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Дизайн Elite Games V5 beta.18 EGM Elite Games Manager v5.17 02.05.2010 |