События и управление
Игра отвечает на действия игрока через события. pygame складывает их в очередь: нажатия и отпускания клавиш, движение и клики мыши, закрытие окна. Каждый кадр программа забирает накопившиеся события и решает, что с ними делать.
Очередь событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
jump()
elif event.key == pygame.K_ESCAPE:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
print("клик в", event.pos)
event.type— вид события:QUIT,KEYDOWN,KEYUP,MOUSEBUTTONDOWN,MOUSEMOTION…- у
KEYDOWNиKEYUPестьevent.key— код клавиши:pygame.K_a,pygame.K_SPACE,pygame.K_UP… - у событий мыши —
event.posиevent.button.
Событие — это изменение: KEYDOWN приходит один раз в момент нажатия, KEYUP — один раз при отпускании. Если реагировать на оба, действие выполнится дважды.
Событие можно создать самому — так его удобно проверять без окна:
e = pygame.event.Event(pygame.KEYDOWN, key=pygame.K_p)
Зажатые клавиши
Для плавного движения нужен ответ на вопрос «зажата ли клавиша сейчас»:
pressed = pygame.key.get_pressed()
if pressed[pygame.K_LEFT]:
hero.x -= 5
pressed[код] — истина, пока клавиша зажата. Значения можно складывать как числа (True — это 1):
dx = pressed[pygame.K_RIGHT] - pressed[pygame.K_LEFT] # -1, 0 или 1
Помните про ось y: «вверх» — это минус.
Что выбрать
| Нужно | Как |
|---|---|
| разовое действие: пауза, выстрел, поворот змейки, меню | KEYDOWN в очереди событий |
| непрерывное движение, пока клавиша зажата | key.get_pressed() каждый кадр |
Правила игры в обработчике
Обработчик событий — место, где живут правила: «на паузу — только клавишей P», «змейка не разворачивается на месте», «неизвестные клавиши ничего не делают». Удобно хранить соответствие клавиш и действий в словаре:
KEYS = {pygame.K_UP: (0, -1), pygame.K_DOWN: (0, 1)}
new = KEYS.get(event.key) # None, если клавиша не из словаря
Итог
pygame.event.get()каждый кадр;event.type,event.key,event.pos;KEYDOWNиKEYUPприходят по одному разу на нажатие и отпускание;key.get_pressed()— что зажато сейчас; вверх — минус по y;- правила управления удобно описывать словарём «клавиша → действие».