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

Знакомство с устройствами ввода

Наиболее часто в компьютерах используется три устройства ввода: клавиатура, мышь и джойстик. Все они неоценимы, но у каждого есть свои сильные и слабые стороны. Клавиатура хороша, когда надо что-то напечатать, но не заменит мышь и слишком велика, чтобы использовать ее как джойстик.

Что касается мыши, она замечательно подходит для указания и перемещения, но ей недостает простоты управления джойстика. Джойстик великолепен для простых перемещений — вверх, вниз, влево и вправо — но почти бесполезен для чего-нибудь другого. Как говорится, «Ни с ним, ни без него».

Каждое устройство ввода взаимодействует с компьютером своим собственным способом — некоторые через драйвера устройств (небольшие программы, единственная цель которых — иметь дело с устройствами ввода), тогда как другие имеют дело непосредственно с памятью компьютера. Ваша задача — запросить у драйвера устройства или операционной системы любую информацию, которую может передавать устройство ввода, и затем обработать эту информацию, как считаете нужным.

Взаимодействие через клавиатуру

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

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

Нажатие или отпускание клавиши посылает сигнал микропроцессору клавиатуры, который, в свою очередь, генерирует сигнал для компьютера, называемый прерывание (interrupt). В свою очередь система получает данные от микропроцессора клавиатуры, позволяющие установить, какая клавиша была нажата или отпущена. Эти данные называются скан-кодами (scan code).

ПРИМЕЧАНИЕ
Прерывание (interrupt) — это сигнал, сообщающий системе, что устройство или программа нуждаются в обслуживании как можно скорее. Использование прерываний гарантирует, что система будет знать об изменении состояния устройства.
Скан-коды (scan code) — это значения, определяющие какая клавиша была нажата или отпущена. Эти коды представляют собой единственный байт (хотя вам система может передавать их в различном виде), в котором часть разрядов определяют клавишу, а один бит сообщает была нажата эта клавиша или отпущена.

Поскольку различные клавиатуры могут иметь различную раскладку, скан-коды могут изменяться в зависимости от клавиатуры. Однако, это не является проблемой, поскольку большинство клавиатур поддерживает стандартную 101 – 102 клавишную раскладку. Если вы не поняли, у каждой клавиатуры есть раскладка, ссылающаяся на клавиши по их номеру, и в большинстве случаев этих клавиш 101 или 102.

ПРИМЕЧАНИЕ
Поскольку скан-коды различают нажатие только одной клавиши, в них нет разницы между заглавными и строчными буквами. Так, скан-код для заглавной A и для строчной a будет одним и тем же. Различия между заглавными и строчными буквами определяет операционная система, отслеживая состояние клавиши Shift.

На рис. 3.1 показана часть раскладки скан-кодов для обычной 101 – 102 клавишной клавиатуры. Обратите внимание, что скан-коды упорядочены согласно расположению клавиш на клавиатуре; в ряду клавиш та клавиша, которая расположена правее обычно имеет большее значение скан-кода.


Рис. 3.1. Фрагмент клавиатуры, показывающий несколько клавиш с их скан-кодами

Рис. 3.1. Фрагмент клавиатуры, показывающий несколько клавиш с их скан-кодами. Как видите, скан-коды это просто порядковые номера


Младшие 7 бит скан-кода (биты с 0 по 6) определяют клавишу (какая клавиша была нажата или отпущена), а старший бит скан кода (бит 7) указывает была ли эта клавиша нажата (бит установлен) или отпущена (бит сброшен). Наибольшее число, которое может быть представлено байтом, равно 255, а старший бит зарезервирован, так что значений остается для 128 клавиш.

Работа с клавиатурой в Windows

Windows может выполнять задачу ввода с клавиатуры за вас. Чтобы облегчить вашу задачу Windows конвертирует поступающие от клавиатуры скан-коды (зависящие от клавиатуры или чего-нибудь еще) в стандартизованные значения, называемые виртуальными кодами клавиш (virtual key codes) и ASCII-кодами (ASCII codes). Windows каким-либо способом передает эти коды программисту, обычно через процедуру обработки сообщений.

ПРИМЕЧАНИЕ
Виртуальные коды клавиш (Virtual Key Code) — это Windows-версия скан-кодов. Вместо того, чтобы использовать для буквы А скан-код 30 (и надеяться, что это правильно), вы применяете макрос виртуального кода клавиши для буквы А, VK_A, и будете уверены, что он всегда соответствует букве А, независимо от того, какая клавиатура используется (и скан-кода, сообщаемого клавиатурой).
ASCII (Американский Стандартный Код для Обмена Информацией, American Standart Code for Information Interchange) — это стандарт, диктующий какое значение какому символу должно соответствовать. С ASCII вы можете различать заглавные и строчные буквы, поскольку им соответствую различные значения. ASCII устанавливает значения для 128 различных символов, среди которых есть цифры, буквы, общеупотребительные знаки и управляющие символы.
Windows обычно использует коды Расширенного ASCII (Extended ASCII) и коды Unicode (или широкие символы, wide character). Расширенный ASCII добавляет еще один бит к значениям обычного ASCII, что увеличивает количество представляемых символов до 256. Недостаток этого варианта заключается в отсутствии стандарта. Кроме того, некоторым языкам требуется больше символов, и поэтому был разработан Unicode, в котором для хранения символов используется 16 бит, что достаточно для 65 536 символов.

Что вы будете делать с полученными виртуальными кодами клавиш или кодами ASCII зависит от вас и вашего приложения. В текстовом редакторе вы можете вставить соответствующую клавише букву в тело текста. В игре вы можете обработать нажатие клавиши и переместить персонаж игрока на экране.

Я только что сказал про использование клавиатуры в играх? Да, верно — вы можете весьма эффективно использовать клавиатуру для игры. Единственная проблема в том, что Windows может не поспевать за бешенным темпом нажатий на клавиши в некоторых играх. Каково же решение? Вы узнаете о нем чуть позже, в разделе «Использование DirectInput».

Играем с мышью

Если несколько друзей — друзья, значит несколько мышей — мышья? Ладно, оставим эту тему для споров другим; меня вполне устраивает вариант «мыши». В отличие от своих пушистых тезок, компьютерные мыши для нас очень полезны.

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

В действительности под твердой спинкой маленького грызуна нет ничего сложного для понимания. На самом нижнем уровне мышь просто сообщает системе, что она передвигается в определенном направлении — по одному сигналу за раз. Драйвер читает эти данные и преобразует сигналы в соответствующие значения перемещения.

В обычном приложении Windows берет эти перемещения и сообщает о них в сообщениях пользователю через процедуру обработки сообщений. Работа процедуры обработки сообщений весьма медленна — каждое сообщение, передаваемое этой процедуре, помещается в очередь, обрабатывающую события в порядке их добавления. Чтобы ускорить процесс получения и обработки данных мыши, вы обращаетесь напрямую к драйверу мыши, исключая процедуру обработки сообщений Windows из процесса.

Независимо от способа получения информации о перемещении мыши, вы отслеживаете координаты указателя мыши на экране. Можно отслеживать абсолютные или относительные координаты мыши. Абсолютные координаты — это текущее местоположение мыши относительно некоторой фиксированной точки (обычно относительно верхнего левого угла экрана, как показано на рис. 3.2). Относительные координаты ссылаются на перемещение влево, вправо, вверх или вниз относительно последней зафиксированной позиции. Как вы вскоре увидите, оба способа легко реализуются.


Рис. 3.2. Вы измеряете абсолютные координаты мыши

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


 

ПРИМЕЧАНИЕ
Относительное перемещение — это величина перемещения относительно последней записанной позиции. Например, если вы стоите и пройдете пять шагов вперед, ваша относительная позиция от того места, где вы находились, будет пять шагов назад.
Наименьшее перемещение, о котором может сообщить мышь называется Микки (Mickey). (Какой удар для старины Уолта!) Драйвер мыши отвечает за преобразование этих Микки в значения, которые он может передать системе.

Кнопки мыши могут только сигнализировать о том, нажаты они в данный момент или нет, точно так же, как это делают клавиши клавиатуры.

Удовольствие с джойстиком

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

Джойстики предназначены для управления играми. Хотя это и не единственные устройства ввода, применяемые в играх, они наиболее естественны. Наклоните рукоятку влево, и ваш персонаж переместится влево. Нажмите кнопку, и ваш герой взмахнет мечом. Что может быть проще?

Джойстики бывают самых различных форм и размеров. Руль, который вы видите на полке магазина — это тоже джойстик. Если вы когда-нибудь были в зале игровых автоматов, то наверное играли в игры где для управления персонажем на экране надо стоять на сноуборде или сидеть на мотоцикле. Пусть вас не обманывает внешность — эти сноуборды и мотоциклы также считаются джойстиками!

Джойстик — это устройство в котором есть контроллер оси и несколько кнопок. У руля один контроллер оси для поворотов руля влево и вправо. Могут быть два дополнительных контроллера оси для педалей газа и тормоза. В обычном двухкнопочном джойстике два контроллера оси — один для перемещений вверх и вниз, и другой для перемещений вправо и влево. Варианты джойстиков показаны на рис. 3.3.

Рис. 3.3. Задающие направление, поворачивающиеся и нажимаемые приспособления для управления - вот общие черты джойстиков, независимо от их внешнего вида

Рис. 3.3. Задающие направление, поворачивающиеся и нажимаемые приспособления для управления — вот общие черты джойстиков, независимо от их внешнего вида


Контроллер оси (axis control) — это просто потенциометр (переменный резистор), регулирующий напряжение в цепи. Наименьшее напряжение в цепи соответствует одному крайнему положению (самой дальней точке, в которую может быть перемещен джойстик) по оси, а наибольшее напряжение — другому крайнему положению. Промежуточные уровни соответствуют положению оси где-нибудь между этими крайними положениями.

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

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

 

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

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

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