Обработка ввода: события и удержание клавиш
Разовое действие — событие. Непрерывное действие — проверка состояния. Перепутать их — частый источник багов управления.
В разделе 20.4 вы уже видели оба способа проверки клавиатуры. Теперь — точнее о том, для какого именно действия годится каждый из них, и что происходит, если их перепутать.
KEYDOWN срабатывает один раз в момент нажатия, а не пока клавиша удерживается. Если завязать на него движение персонажа, он сдвинется ровно на один шаг за нажатие и застынет, даже если игрок продолжает держать клавишу — для непрерывного движения нужен pygame.key.get_pressed(), проверяемый каждый кадр.klavishi[pygame.K_SPACE] каждый кадр и стрелять при каждом истинном значении, при 60 FPS одно удержание пробела за секунду произведёт около 60 выстрелов — клавиша ведь остаётся нажатой всё это время. Для разового действия по нажатию нужно именно событие KEYDOWN, а не проверка текущего состояния.Мышь устроена так же двойственно
У мыши тот же выбор: событие pygame.MOUSEBUTTONDOWN — для
разового клика, а pygame.mouse.get_pressed() — для проверки,
зажата ли кнопка прямо сейчас (полезно, например, для рисования линии, пока кнопка мыши
удерживается). Текущие координаты курсора в любой момент доступны через
pygame.mouse.get_pos().
Мост к геймпаду и тачскрину
Абстракция игрового действия из раздела 20.11 ("prygok"
вместо конкретной клавиши) особенно окупается именно здесь: под ней могут одинаково
скрываться и KEYDOWN с пробелом, и кнопка геймпада
(pygame.JOYBUTTONDOWN), и тап по виртуальной кнопке на
тачскрине — код самой игры при этом не меняется ни на строку.