Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming / GameProg / RPG_Programming_2ed.pdf
Скачиваний:
240
Добавлен:
12.02.2016
Размер:
12.06 Mб
Скачать

Джим Адамс

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

Данные джойстика представляют собой значения, показывающие отклонение от центральной позиции. Отклоните рукоятку влево или вверх и вы получите отрицательное значение, представляющее расстояние от центра. Отклоните рукоятку вниз или вправо, и вы получите положительные значения. Кнопки представляются отдельными флагами, которые установлены, если кнопка нажата.

ПРИМЕЧАНИЕ Единственное большое различие между джойстиками, которое вы можете заметить, заключается в том, что джойстики с цифровыми контроллерами оси работают как набор кнопок. В таких джойстиках отклонение рукоятки влево аналогично нажатию кнопки «влево». Всякий раз, когда программист запрашивает такой джойстик о положении оси, ему будет возвращено минимальное или максимальное значение.

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

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

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

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

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

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

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

netlib.narod.ru

169

Глава 3. Взаимодействие с пользователем с DirectInput

объект, 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.

Объект IDirectInput8 содержит набор функций, используемых для

инициализации системы ввода и получения интерфейсов устройств (которые

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

перейдем к непосредственной работе с устройствами ввода в разделе «Используем устройства DirectInput».

170

netlib.narod.ru

Джим Адамс

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

Инициализация 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. Функция может завершиться удачно, но

вернуть код ошибки, а макросы определят это за вас.

netlib.narod.ru

171

Соседние файлы в папке GameProg