netlib.narod.ru | < Назад | Оглавление | Далее > |
Скорее всего, вы будете использовать клавиатуру и мышь, а так же было бы удобно иметь возможность пользоваться джойстиком. Однако, доступно так много различных типов этих устройств, что голова кружится от одной мысли попытаться поддерживать их все.
Конечно, для общения с мышью и клавиатурой вы можете использовать очередь сообщений Windows, что сделает вашу жизнь легче. Проблема в том, что очередь сообщений медленная — ну сколько можно ждать, пока критически важная информация о нажатии клавиш или перемещении мыши пройдет через очередь сообщений, когда она нужна прямо сейчас?
Встречайте DirectInput — решение ваших проблем. С ним вы получаете метод быстрого получения данных, когда они нужны вам, вместо того, чтобы ждать пока их предоставит Windows. Оказывается, DirectInput самый простой для использования компонент DirectX.
Благодаря DirectInput ваши программы могут легко использовать любые клавиатуры, мыши и джойстики, подключенные к системе пользователя (а также и любые другие устройства ввода, совместимые с DirectInput). А когда вы попытаетесь написать работающий код, то обнаружите, что он занимает всего несколько десятков строк!
DirectInput представляет собой коллекцию COM-объектов (подобно всем остальным компонентам DirectX) которые представляют систему ввода, а также отдельные устройства ввода (как показано в таблице 3.1). Главный объект, IDirectInput8, используется для инициализации системы и создания интерфейсов устройств ввода.
Таблица 3.1. COM-объекты DirectInput
Объект | Описание |
IDirectInput8 | Главный COM-интерфейс DirectInput 8. Все другие интерфейсы запрашиваются через него. |
IDirectInputDevice8 | COM-интерфейс для устройств ввода. Каждое устройство имеет отдельный собственный интерфейс для использования. |
IDirectInputEffect | COM-интерфейс для эффекта обратной связи, имеющегося в некоторых моделях джойстиков и мышей. |
Для работы с каждым устройством ввода (таким, как клавиатура, мышь или джойстик) используется объект общего интерфейса IDirectInputDevice8. Некоторые устройства, такие как джойстики и мыши, позволяют отправлять соответствующему им объекту IDirectInputDevice8 запросы на получение дополнительного интерфейса IDirectInputEffect, который применяется для управления поддерживаемыми эффектами обратной связи. Взаимоотношения между интерфейсами IDirectInput8, IDirectInputDevice8 и IDirectInputEffect показаны на рис. 3.4.
Рис. 3.4. Распорядителем шоу является IDirectInput8, который создает различные объекты IDirectInputDevice8. В свою очередь объекты IDirectInputDevice8 могут использоваться для создания их собственных объектов IDirectInputEffect.
Объект IDirectInput8 содержит набор функций, используемых для инициализации системы ввода и получения интерфейсов устройств (которые и будут выполнять всю работу). Из этих функций вам обычно будут нужны только две: IDirectInput8::EnumDevices и IDirectInput8::CreateDevice. О них вы узнаете больше, когда мы перейдем к непосредственной работе с устройствами ввода в разделе «Используем устройства DirectInput».
Перед тем, как начать использовать DirectInput, убедитесь, что в ваш проект включен заголовочный файл DInput.h и при компоновке используется библиотека DInput8.lib. Главный объект DirectInput представляется объектом IDirectInput8, так что мы разместим его в разделе глобальных объявлений:
IDirectInput8 g_pDI; // Глобальный объект DirectInput
DirectInput предоставляет вспомогательную функцию DirectInput8Create, которая инициализирует этот интерфейс для вас. Вот ее прототип:
HRESULT WINAPI DirectInput8Create( HINSTANCE hInstance, // Дескриптор экземпляра вашей программы DWORD dwVersion, // DIRECTINPUT_VERSION REFIID riidltf, // IID_IDirectInput8 LPVOID *ppvOut, // Указатель на новый объект LPUNKNOWN pUnkOuter); // Устанавливаем NULL
В аргументах нет ничего сложного; вы просто предоставляете указатель на создаваемый объект и устанавливаете остальные параметры, как сказано в комментариях. Приведенный ниже фрагмент кода показывает, как можно создать интерфейс DirectInput:
IDirectInput8 *g_pDI; // Глобальный объект DirectInput int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int nCmdShow) { HRESULT hr; hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL); // Сообщаем о сбое, если произошла ошибка if(FAILED(hr)) return FALSE; // Переходим к основной программе
Вот и все,что относится к инициализации DirectInput! Далее мы узнаем о том, как инициализировать объект устройства для работы с конкретным оборудованием (клавиатурой, мышью и джойстиком).
g_pDI->Release();
netlib.narod.ru | < Назад | Оглавление | Далее > |