Вход/Регистрация
Графика DirectX в Delphi
вернуться

Краснов Михаил

Шрифт:

Обычно игры используют функции библиотеки Directlnput для организации управления, с ними мы и бегло познакомимся в данном разделе. Эта библиотека является частью DirectX и содержит набор функций для обеспечения пользовательского ввода с максимальной скоростью. Высокая скорость работы даже с традиционными устройствами обеспечивается тем, что Directlnput обходит часто применяемые механизмы операционной системы и обращается к устройствам напрямую. Поэтому установленные в системе параметры, такие как частота повтора символов для клавиатуры или чувствительность мыши, не влияют на скорость ввода.

Directlnput использует модель СОМ. Посему, после изучения DirectDraw, нам будет легко знакомиться с ним: мы встретим здесь знакомые понятия главного объекта и интерфейсов.

Разбирая очередной пример (проект каталога Ех05), я попутно расскажу об основных понятиях библиотеки Directlnput. По виду пример представляет собой обычное оконное приложение, в компоненте класса тмето выводятся скан-коды нажимаемых клавиш, нажатие кнопки Clear приводит к очистке его содержимого (рис. 5.6).

В списке "uses помимо обычных для Delphi модулей мною вписан DirectlnputS.

Глобальная переменная Dlnput обеспечивает доступ к функциям Directinput:

var

Dinput : IDIRECTINPUT8 = nil; // Главный объект Directinput

// Интерфейс доступа к устройству ввода

DIKeyboard : IDIRECTINPUTDEVICE8 = nil;

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

Следующая пользовательская функция предназначена для подготовки работы (обработку ошибок оставлю только для первого действия):

function TfrmDX.Or.CreateDevlce : HRF.SULT;

var

hRet : HRESULT; // Результат действий

dipdw : TDIPROPDWORD; // Вспомогательная структура, задание параметров

begin

// Создание главного объекта Directlnput

hRet := DirectlnputSCreate (hlnstance, DIRECTINPUT_VERSION,

IID_IDirectInput8, DInput, nil);

if Failed (hRet) then begin

Result := hRet;

Exit

end;

// Создание объекта ввода информации от клавиатуры

hRet := DInput.CreateDevice (GUID_SysKeyboard, DIKeyboard, nil);

// Задаем формат данных, получаемых от устройства

hRet := DIKeyboard.SetDataFormat(c_dfDIKeyboard);

// Задаем уровень кооперации

hRet := DIKeyboard.SetCooperativeLevel(Handle, DISCL_NONEXCLUSIVE or

DISCL_BACKGROUND);

// Параметры для буферной схемы получения данных

ZeroMemory (Sdipdw, SizeOf (dipdw)); with dipdw do begin

diph.dwSize := SizeOf(TDIPROPDWORD);

diph.dwHeaderSize := SizeOf(TDIPROPHEADER);

diph.dwObj := 0;

diph.dwHow := DIPHJDEVICE;

dwData := SAMPLE_BUFFER_SIZE;

end;

// Задаем параметры буфера

hRet := DIKeyboard.SetProperty(DIPROP_BUFFERSIZE, dipdw.diph);

// Установили связь с устройством ввода

Result := DIKeyboard.Acquire;

end;

Для создания главного объекта из библиотеки Directlnput должна использоваться функция DirectlnputSCreate. Аргументы ее таковы:

* указатель на вызывающий поток; версия DirectX, в которой создано приложение; идентификатор требуемого интерфейса; переменная, в которую помещается результат.

Последний аргумент - указатель на показатель агрегирования (разновидность наследования; термин, специфичный для СОМ) - обычно равен nil.

В случае удачи функция возвращает ноль. Такому значению соответствует константа DI_OK, определенная в модуле Directinputs.

Метод CreateDevice главного объекта используется для создания нового объекта устройства. У этого метода три аргумента:

* идентификатор нужного устройства; переменная, в которую помещается результат; показатель агрегирования.

В качестве идентификатора для клавиатуры передаем константу GUID_SysKeyboard.

Перед захватом устройства необходимо вызвать метод setoataFormat объекта, связанного с устройством ввода. Здесь описывается формат, в котором вводимые данные возвращаются устройством. Для стандартного устройства задаем стандартный формат.

Также обязательным действием является определение степени контроля над устройством, задание уровня кооперации, другим словом. Для этого вызывается метод setcooperativeLevel, первый аргумент которого - идентификатор окна приложения.

  • Читать дальше
  • 1
  • ...
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: