Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 3.2. Чтение позиции джойстика.
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. При старте она просит игрока: § Подвигать джойстиком; § Установить джойстик в среднее положение; § Понажимать на кнопки. Затем, программа сохраняет результаты процедуры калибровки в глобальных переменных.
|