"Информатика. (в 2 частях)", Поляков К.Ю., Еремин Е.А.
Клавиатура позволяет пользователю управлять программой: запускать действие, перемещать объект или останавливать его. Чтобы реагировать на ввод, программа получает события нажатия и отпускания клавиш и обрабатывает их в основном цикле. Для непрерывного движения она регулярно проверяет, нажата ли клавиша сейчас. Если связать нужные клавиши с командами, объект будет выполнять именно те действия, которые задумал программист.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Событие клавиатуры — сообщение о действии пользователя, например нажатии или отпускании клавиши. Оно сообщает программе, что произошло, и помогает ей выбрать подходящую реакцию. Без такого сигнала программе пришлось бы угадывать, чего хочет пользователь.
Обработчик события — часть программы, которая выполняет заданные команды в ответ на событие клавиатуры. Например, обработчик может изменить координату объекта или запустить звук. Он нужен, чтобы связать действие пользователя с понятным результатом.
Состояние клавиши — информация о том, нажата ли клавиша в данный момент. Программа может проверять это состояние снова и снова, пока работает. Такая проверка нужна, когда действие должно продолжаться всё время, пока пользователь удерживает клавишу.
Клавиша управления — клавиша, которой назначено действие программы или объекта. Например, стрелкам можно назначить перемещение, а пробелу — запуск действия. Такое назначение делает управление понятным: пользователь нажимает выбранную клавишу и получает ожидаемый результат.
Когда пользователь нажимает клавишу, программа получает сообщение о вводе. Такое сообщение называют событием клавиатуры: оно указывает, какое действие произошло и с какой клавишей оно связано. Программе нужно следить за событиями, потому что пользователь может подать команду в любой момент работы приложения. Получив событие, программа передаёт его обработчику и выполняет подходящие команды.
Нажатие и отпускание — разные события, поэтому программа может реагировать на них по-разному. Нажатие удобно использовать для действия, которое должно запуститься один раз: например, для выстрела или открытия меню. Отпускание подходит, если после прекращения нажатия нужно выполнить отдельную команду, например остановить объект. Если перепутать эти события, действие может начаться или закончиться не тогда, когда ожидает пользователь.
Основной цикл программы многократно повторяет команды, пока приложение работает. Внутри него программа проверяет, не появились ли события клавиатуры, и передаёт найденное событие нужному обработчику. Это необходимо, потому что команда пользователя не обязательно совпадает по времени с началом работы программы. Повторная проверка позволяет заметить ввод и отреагировать, не останавливая выполнение остальных действий.
Чтобы управлять объектом, конкретным клавишам назначают команды, которые меняют его положение. Например, при нажатии стрелки вверх программа уменьшает вертикальную координату, а при нажатии стрелки вниз — увеличивает её. Точное направление изменения зависит от того, как в программе устроены координаты. Раздельные условия для разных клавиш позволяют объекту выполнять разные движения по команде пользователя.
Однократное событие нажатия само по себе не повторяется всё время, пока клавиша остаётся нажатой. Поэтому для непрерывного перемещения основной цикл регулярно проверяет текущее состояние клавиши и понемногу меняет координаты, пока она удерживается. Когда пользователь отпускает клавишу, проверка показывает, что она больше не нажата, и изменение координат прекращается. Так программа может поддерживать движение без повторных нажатий.
| Способ | Что проверяет программа | Когда выполняется действие | Пример применения |
|---|---|---|---|
| Обработка нажатия | Событие нажатия клавиши | Один раз при нажатии | Запуск действия или выстрела |
| Обработка отпускания | Событие отпускания клавиши | Один раз при отпускании | Остановка движения |
| Проверка состояния | Нажата ли клавиша сейчас | Пока клавиша удерживается | Непрерывное перемещение объекта |
Выбирай способ в зависимости от того, когда должно выполняться действие. Для команды, которая нужна один раз, подходит обработка нажатия или отпускания; для движения при удержании — регулярная проверка состояния. В одной программе можно сочетать все три способа.
Условие: назначить клавише пробел запуск заданного действия. Сначала нужно определить, должно ли действие срабатывать один раз при нажатии или продолжаться во время удерживания. В этой задаче требуется однократный запуск, поэтому достаточно события нажатия.
Ответ: действие запускается обработчиком события нажатия пробела. Если пользователь нажмёт другую клавишу или отпустит пробел, это условие не выполнится.
Условие: перемещать объект вверх и вниз с помощью стрелок. Для перемещения программа должна менять координату объекта, а направление зависит от того, какая клавиша нажата. До записи команд нужно выяснить, как в программе меняется вертикальная координата при движении вверх и вниз.
Ответ: стрелке вверх назначается изменение координаты вверх, а стрелке вниз — обратное изменение. Знак изменения зависит от принятой в программе системы координат.
Условие: объект должен двигаться, пока клавиша удерживается, и остановиться после отпускания. Одно событие нажатия не сообщает программе о том, что клавиша продолжает оставаться нажатой. Поэтому для движения нужна проверка текущего состояния, а для остановки можно использовать отпускание или прекращение изменения координат после проверки.
Ответ: повторная проверка состояния обеспечивает движение при удержании, а отпускание клавиши прекращает его. Важно, чтобы проверка и изменение координат находились в основном цикле.
Путать нажатие и отпускание. Тогда обработчик может сработать в неподходящий момент: например, действие запустится при отпускании, хотя должно запускаться при нажатии. Такую ошибку допускают, если не уточняют, какое именно действие пользователя требуется обработать. Проверь себя: нажми клавишу и отпусти её по очереди, наблюдая, когда срабатывает команда.
Неверно указывать клавишу. Из-за ошибки в обозначении программа может ждать другую клавишу или вообще не распознавать нужную. Это часто случается, когда названия клавиш записывают в неподходящем формате или путают похожие обозначения. Проверь, что сравниваешь событие именно с нужной клавишей, и отдельно испытай каждую клавишу управления.
Не проверять события в основном цикле. Если программа проверяет ввод только один раз, она может не заметить нажатие, произошедшее позже. Причина — забытая проверка внутри цикла, который продолжает работу приложения. Проверь, что проверка выполняется во время работы программы, а не только перед запуском.
Ждать непрерывного движения от однократного нажатия. Событие нажатия обычно обрабатывается один раз, поэтому объект может лишь сдвинуться на небольшое расстояние. Ошибку допускают, когда не различают событие и состояние удерживаемой клавиши. Для проверки удерживай клавишу: если движение не продолжается, настрой регулярную проверку её состояния в основном цикле.
Чтобы проверять ввод снова и снова, нужно знать, как работает цикл программы: он повторяет команды, пока приложение не завершено. Условные команды позволяют выбрать нужную реакцию, например выполнить действие только тогда, когда нажата определённая клавиша. Эти знания помогают понять, где размещать проверку и как связать её с обработчиком.
Для перемещения нужно представлять положение объекта с помощью координат и уметь изменять их. Например, изменение одной координаты перемещает объект по вертикали или горизонтали, но направление зависит от принятой системы отсчёта. Это пригодится при создании игр и интерактивных приложений, где пользователь управляет объектами с клавиатуры.
Чем событие нажатия клавиши отличается от проверки, нажата ли клавиша?
Событие нажатия сообщает, что клавишу только что нажали, и обычно обрабатывается один раз. Проверка состояния показывает, удерживается ли она в данный момент, поэтому её можно повторять в цикле.
Почему программа должна постоянно проверять события клавиатуры?
Пока программа работает, пользователь может нажать или отпустить клавишу в любой момент. Проверка в основном цикле позволяет вовремя заметить это событие и выполнить нужные команды.
Как назначить действие на конкретную клавишу?
Нужно проверить, что произошло событие нажатия именно этой клавиши, и связать проверку с нужной командой. Например, при нажатии пробела можно запустить заданное действие.
Как сделать непрерывное движение при удержании клавиши?
В основном цикле нужно регулярно проверять состояние клавиши. Пока она нажата, программа изменяет координаты объекта на небольшую величину, поэтому тот продолжает двигаться.
Как остановить движение после отпускания клавиши?
Можно обрабатывать событие отпускания и прекращать движение, например сбрасывать признак движения. Если движение задаётся проверкой состояния, после отпускания условие перестанет выполняться и координаты перестанут изменяться.
§ 45. Управление с помощью клавиатуры