Глава 20 · Разработка игр с Pygame

Обработка ввода: события и удержание клавиш

Разовое действие — событие. Непрерывное действие — проверка состояния. Перепутать их — частый источник багов управления.

В разделе 20.4 вы уже видели оба способа проверки клавиатуры. Теперь — точнее о том, для какого именно действия годится каждый из них, и что происходит, если их перепутать.

События или состояние?
Действие происходит один раз за нажатие (прыжок, пауза, выстрел)
pygame.event.get() + KEYDOWN
Действие длится, пока клавиша зажата (бег влево/вправо)
pygame.key.get_pressed()
KEYDOWN для непрерывного движения — персонаж дёргается
Событие KEYDOWN срабатывает один раз в момент нажатия, а не пока клавиша удерживается. Если завязать на него движение персонажа, он сдвинется ровно на один шаг за нажатие и застынет, даже если игрок продолжает держать клавишу — для непрерывного движения нужен pygame.key.get_pressed(), проверяемый каждый кадр.
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), и тап по виртуальной кнопке на тачскрине — код самой игры при этом не меняется ни на строку.

Практика: события и состояние клавиатуры
Pygame открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →