netlib.narod.ru< Назад | Оглавление | Далее >

Использование DirectInput

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

Конечно, для общения с мышью и клавиатурой вы можете использовать очередь сообщений Windows, что сделает вашу жизнь легче. Проблема в том, что очередь сообщений медленная — ну сколько можно ждать, пока критически важная информация о нажатии клавиш или перемещении мыши пройдет через очередь сообщений, когда она нужна прямо сейчас?

Встречайте DirectInput — решение ваших проблем. С ним вы получаете метод быстрого получения данных, когда они нужны вам, вместо того, чтобы ждать пока их предоставит Windows. Оказывается, DirectInput самый простой для использования компонент DirectX.

Благодаря DirectInput ваши программы могут легко использовать любые клавиатуры, мыши и джойстики, подключенные к системе пользователя (а также и любые другие устройства ввода, совместимые с DirectInput). А когда вы попытаетесь написать работающий код, то обнаружите, что он занимает всего несколько десятков строк!

Представляем основы DirectInput

DirectInput представляет собой коллекцию COM-объектов (подобно всем остальным компонентам DirectX) которые представляют систему ввода, а также отдельные устройства ввода (как показано в таблице 3.1). Главный объект, IDirectInput8, используется для инициализации системы и создания интерфейсов устройств ввода.

ПРИМЕЧАНИЕ
Да, вы прочитали правильно, — DirectInput все еще использует объекты версии 8, несмотря на то, что вы установили DirectX SDK версии 9! Это вызвано тем, что по сравнению с 8 версией в DirectInput были сделаны очень незначительные изменения, и Microsoft оставила все как есть. Разве не очаровательно?

Таблица 3.1. COM-объекты DirectInput



Объект Описание

IDirectInput8 Главный COM-интерфейс DirectInput 8. Все другие интерфейсы запрашиваются через него.
IDirectInputDevice8 COM-интерфейс для устройств ввода. Каждое устройство имеет отдельный собственный интерфейс для использования.
IDirectInputEffect COM-интерфейс для эффекта обратной связи, имеющегося в некоторых моделях джойстиков и мышей.

 

ПРИМЕЧАНИЕ
В этой книге я буду использовать только два первых COM-объекта из таблицы 3.1, а IDirectInputEffect останется за кадром.

Для работы с каждым устройством ввода (таким, как клавиатура, мышь или джойстик) используется объект общего интерфейса IDirectInputDevice8. Некоторые устройства, такие как джойстики и мыши, позволяют отправлять соответствующему им объекту IDirectInputDevice8 запросы на получение дополнительного интерфейса IDirectInputEffect, который применяется для управления поддерживаемыми эффектами обратной связи. Взаимоотношения между интерфейсами IDirectInput8, IDirectInputDevice8 и IDirectInputEffect показаны на рис. 3.4.


Рис. 3.4. Распорядителем шоу является IDirectInput8, который создает различные объекты IDirectInputDevice8

Рис. 3.4. Распорядителем шоу является IDirectInput8, который создает различные объекты IDirectInputDevice8. В свою очередь объекты IDirectInputDevice8 могут использоваться для создания их собственных объектов IDirectInputEffect.


Объект IDirectInput8 содержит набор функций, используемых для инициализации системы ввода и получения интерфейсов устройств (которые и будут выполнять всю работу). Из этих функций вам обычно будут нужны только две: IDirectInput8::EnumDevices и IDirectInput8::CreateDevice. О них вы узнаете больше, когда мы перейдем к непосредственной работе с устройствами ввода в разделе «Используем устройства DirectInput».

Инициализация 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

 

ПРИМЕЧАНИЕ
Функция DirectInput8Create, как и все COM-интерфейсы возвращает значение типа HRESULT. Если все завершилось успешно, DirectInput возвращает значение DI_OK, а в случае неудачи — другое значение. Коды ошибок описаны в документации к DirectX SDK. Проверяя возвращаемый код используйте макросы FAILED или SUCCEEDED. Функция может завершиться удачно, но вернуть код ошибки, а макросы определят это за вас.

В аргументах нет ничего сложного; вы просто предоставляете указатель на создаваемый объект и устанавливаете остальные параметры, как сказано в комментариях. Приведенный ниже фрагмент кода показывает, как можно создать интерфейс 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! Далее мы узнаем о том, как инициализировать объект устройства для работы с конкретным оборудованием (клавиатурой, мышью и джойстиком).

ПРИМЕЧАНИЕ
Как и для всех COM-объектов, убедитесь, что вызвали метод Release, когда закончили работу.
g_pDI->Release();

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz