oldi

Советы пользователям C++Builder

Часть 7

Наталия Елманова

Совет 18. Немного о джойстиках

Посвящается всем любителям компьютерных игр…

В одной из предыдущих статей данного цикла (КомпьютерПресс №3’99) были рассмотрены некоторые вопросы, связанные с использованием внешних устройств. Данная статья продолжает начатую тему. Она связана и с темой номера — мультимедиа, и посвящена использованию джойстика. Некоторые (но далеко не все) идеи, послужившие основой для рассмотренного ниже примера, заимствованы из малодоступного российскому читателю источника "C++Builder - how-to" (J.Miano, T.Cabanski, H.Howe. - Waite Group Press, 1997).

Использование джойстика базируется на использовании нескольких функций Windows API и структур Windows, описанных в файле mmsystem.h. (Ред. Перечисленные ниже функции Win32 API предоставляют базовые средства для управления джойстиком. Если вам нужны более комплексные функции, обратитесь к компоненту DirectInput, входящему в состав набора интерфейсов DirectX — Прим. ред.) Сервисы, обслуживающие джойстики, загружаются при загрузке операционной системы. 32-разрядные версии Windows могут использовать два джойстика, каждый из которых может иметь от одной до четырех кнопок. Каков именно ваш джойстик и каковы характеристики его драйвера, можно определить с помощью соответствующих функций Windows API. Помимо этого, с помощью других функций можно определить, какие из кнопок нажаты в данный момент и каковы текущие координаты, связанные с наклоном его ручки (joystick's positional information). Это можно сделать периодически опрашивая джойстик, либо обрабатывая полученные от него события.

Разработаем простейшее приложение для тестирования джойстика. С этой целью создадим форму, на которую поместим компонент TImage с изображением джойстика и четыре компонента TShape (в данном случае это красные эллипсы) для изображения нажатых кнопок. Сделаем компоненты TShape невидимыми. Кроме того, поместим на форму компоненты TMemo и TPaintBox. И, наконец, поместим на форму компонент TImageList, в который поместим одно-единственное изображение, более или менее похожее на прицел джойстика (рис.1):

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

Для начала следует сослаться на файл mmsystem.h (в нем описаны необходимые структуры и функции для управления джойстиком и получения информации от него).

Первое, что нужно сделать, - это узнать, установлен ли вообще драйвер джойстика, и если да, то подключен ли джойстик. Для этой цели используется функция joyGetNumDevs(). Если она возвращает значение, отличное от нуля, это означает, что драйвер джойстика установлен:

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

Как обрабатывать события, свзанные с джойстиком? Функция joySetCapture предназначена для перенаправления сообщений джойстика данному окну (в нашем случае - главному окну нашего приложения). Параметры этой функции содержат дескриптор окна, указатель на то, первый или второй джойстик должен посылать сообщения, частоту отправки этих сообщений (в данном случае используется минимально возможный период, определяемый с помощью все той же структуры JOYCAPS), а также параметр, указывающий на то, нужно ли посылать сообщения, если в состоянии джойстика ничего не изменилось.

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

Теперь можно создать функции, реагирующие на события джойстика. Одна из них должна делать видимыми те из объектов TShape, которые соответствуют нажатым кнопкам. Вторая должна отображать "прицел", перемещая его внутри компонента TPaintBox. Помимо этого, следует сослаться на эти функции в h-файле, указав, что они являются реакцией на соответствующие сообщения Windows.

Текст h-файла, таким образом, имеет вид:

Сам исходный текст модуля, связанного с главной формой приложения, имеет вид:

Запустив приложение при корректно установленном драйвере и подключенном джойстике, можно попробовать нажимать на кнопки и перемещать рычаг. При этом изображение прицела будет перемещаться внутри компонента TPaintBox, а при нажатии на кнопки в соответствующих местах на экране будут появляться красные эллипсы (рис.2).

КомпьютерПресс 7'1999