</>
Topic 5 of 6

Course materials are currently available in Russian only.

События и управление

Игра отвечает на действия игрока через события. 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;
  • правила управления удобно описывать словарём «клавиша → действие».