Читайте также: |
|
unsigned int Joystick{unsigned char stick)
{
asm {
cli;запретить прерывания
mov ah,byte ptr stick;замаскировать АН,
;чтобы выбрать джойстик
хоr аl,аl;обнулить AL
xor cx,cx;обнулить СХ
mov dx,JOYPORT;используем DX для ввода и вывода
out dx,al
discharge:
in al,dx;читаем данные из порта
test al,ah;изменился ли бит запроса?
loopne discharge;если нет, повторяем чтение
sti;разрешить прерывания
хог ах, ах;обнулить АХ
sub ах,сх,;теперь АХ содержит позицию джойстика
} // конец ассемблерного блока
// возвращаемое значение содержится в АХ
} // конец функции
(Кстати, встроенный ассемблер мне все больше и больше нравится.) Программа достаточно проста: при запуске программа обнуляет регистры АХ и СХ;
§ Затем программа опрашивает порт джойстика;
§ Далее подсчитывается количество циклов в ожидании, пока установится нужный бит;
§ Подсчет выполняется в регистре СХ с помощью инструкции LOOPXX (в данном случае используется команда LOOPNE);
§ Инструкция TEST определяет установку бита;
§ Когда нужный бит установлен, программа выходит из цикла. Результат передается вызывающей программе, в регистре АХ.
С этим вроде все. Позже я покажу демонстрационную программу, в которой применяются все функции джойстика. Благодаря обращению к BIOS она обладает лучшей совместимостью, легче переносима и умеет производить самокалибровку. Я думаю, что и вы будете пользоваться ею.
Калибровка джойстика
Теперь разберемся с калибровкой джойстика. Как я уже говорил ранее, результат, который мы получим от чтения джойстика в цикле, будет разным на разных ПК. На одних компьютерах значения по оси Х окажется в пределах от 0 до 255, на других - от 0 до 10000.
Таким образом, нам надо нормализовать эти данные или масштабировать их. Стандартным приемом в данных случаях может служить калибровка джойстика самим игроком в setup'e игры. Во время этой процедуры игрок двигает джойстиком, а программа считывает и запоминает данные калибровки где-нибудь на диске для дальнейшего использования.
Для того чтобы проанализировать джойстик, программа должна:
§ Найти значения максимального и минимального отклонения по осям Х и Y;
§ Сохранить эту информацию;
§ Использовать полученные данные для выяснения, на какой угол игрок отклонил ручку джойстика.
Например, джойстик был откалиброван и мы обнаружим, что ось Х имеет значения от 0 до 255. Затем, если значение джойстика, например, по координате Х окажется равным 128, то можно с уверенностью сказать, что рукоятка находится в среднем положении (кстати, в процессе калибровки средняя позиция также запоминается).
Осталась одна маленькая деталь, о которой стоит сказать — это детектирование джойстика (то есть проверка его наличия). Обычная техника детектирования такая: в цикле опрашивается порт джойстика в течение определенного времени. Но надо сказать, что с помощью функций BIOS это можно сделать более надежно. Если после вызова функции значения по всем координатам равны 0, то никакого джойстика нет.
Я думаю, что мы уже сказали о джойстиках все. Теперь напишем небольшую программку, в, которой используем функции из Листингов 3.1 и 3.2. При старте она просит игрока:
§ Подвигать джойстиком;
§ Установить джойстик в среднее положение;
§ Понажимать на кнопки.
Затем, программа сохраняет результаты процедуры калибровки в глобальных переменных.
Дата добавления: 2015-07-12; просмотров: 74 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Листинг 3.1. Чтение кнопок джойстика. | | | Листинг 3.3. Программа работы с джойстиком (JOY.C). |