Pygame для начинающих программистов. Статья вторая. События

от автора

В первой статье мы определились с каркасом программы, разобрали ее структуру и разложили по блокам. В этой статье для нас будет интересен главный игровой цикл

Разделим его на три условных раздела:

  1. Обработка событий. Причем этот раздел желательно помещать в начале игрового цикла!

  2. Описание логики игры. Эта самая сложная и наиболее важная часть.

  3. Отображение графики. Здесь у нас визуализация, графика, анимация.

import pygame pygame.init() pygame.display.set_mode((400, 200)) run = True while run:     # 1-й Раздел ----- Обработка событий -----------     for e in pygame.event.get():         if e.type == pygame.QUIT:             run = False     # -----------------------------------------------      # 2-й Раздел ----- Логика игры ------------------     #     # -----------------------------------------------      # 3-й Раздел -----  Отображение графики ---------     # Очищаем экран     # Рисуем все объекты на экране     # Обновление экрана     # -----------------------------------------------  pygame.quit()

События. events

Благодаря разнообразию типов событий, pygame предоставляет гибкий механизм для создания интерактивных приложений. Мы можем легко добавить поддержку клавиатуры, мыши, джойстиков  и других устройств ввода-вывода.

События будем брать из функции pygame.event.get()

Эта функция позволяет разработчику получать доступ ко всем событиям, происходящим в приложении. pygame.event.get() предназначена для извлечения всех событий, накопленных с момента последнего вызова этой функции. Она возвращает список объектов-событий, каждый из которых представляет собой отдельное действие, совершенное пользователем или системой. К таким действиям относятся нажатия клавиш, щелчки мышью, перемещения курсора, а также системные события, такие как закрытие окна программы. Эта функция не принимает никаких аргументов и всегда возвращает список объектов-событий. Если событий нет, возвращается пустой список.

Немного о самом объекте события.

За событие отвечает объект pygame.event.Event. Этот объект содержит не только информацию о типе события, но и дополнительные данные, которые могут быть связаны с конкретным событием. Эти дополнительные данные хранятся в виде словаря.

Основные атрибуты объекта pygame.event.Event включают:

  • type: тип события (например, pygame.QUIT, pygame.KEYDOWN и т.д.).

  • dict: словарь с дополнительными данными, который может содержать любую информацию, специфичную для данного события.

Что такое дополнительные данные у объекта события? Давайте разберемся.

Для события нажатия клавиши (KEYDOWN) дополнительный словарь может содержать:

  • key: идентификатор нажатой клавиши.

  • mod: модификаторы клавиш (например, Shift, Ctrl).

Для события мыши (MOUSEBUTTONDOWN) словарь может содержать:

  • pos: координаты курсора мыши в момент нажатия кнопки.

  • button: номер кнопки мыши, которая была нажата.

Для начинающих программистов это все непонятно, пока мы не начнем писать практические примеры! Давайте же их напишем.

Пример первый.

    # 1-й Раздел ----- Обработка событий -----------     for e in pygame.event.get():         if e.type == pygame.QUIT:             run = False                  if e.type == pygame.KEYDOWN:             my_key = e.key             my_mod = e.mod             print(f"Нажата клавиша: {pygame.key.name(my_key)}")             print(f"Модификатор: {my_mod}")         if e.type == pygame.MOUSEBUTTONDOWN:             my_pos = e.pos             my_button = e.button             print(f"Позиция мыши: {my_pos}")             print(f"Идентификатор кнопки мыши: {my_button}")     # -----------------------------------------------

Давайте разбираться! 

Так как pygame.event.get() это есть список, то будем применять цикл for in, для извлечения элементов списка (типов событий) в переменную e (имя этой переменной мы придумали сами).

У нас в коде в обработке три события. 

Первый тип: pygame.QUIT, мы его немного разобрали в предыдущей статье. Тип события — закрытие окна. Как только этот тип срабатывает, в переменную run помещается значение False и мы грамотно выходим из главного игрового цикла. Вся, программа после pygame.quit() корректно  завершается.

Второй тип: pygame.KEYDOWN. Обрабатывает событие нажатия клавиши, в нашем случае любой клавиши на клавиатуре. У клавиш есть данные объекта, это key  и mod. В программе, помещаем их в наши переменные и выводим информацию на консоль. Переменную my_key используем как параметр в функции pygame.key.name(my_key)

Функция pygame.key.name() в библиотеке pygame, используется для получения строкового представления имени клавиши на основе её кода. Эта функция полезна для отображения информации о нажатых клавишах в игре. 

Также обратите внимание на переменную my_mod, поэкспериментируйте с нажатием  клавиши Caps Lock, Shift и других клавиш. Вся информация по нажатым клавишам будет выводиться на консоль.

Третий тип: pygame.MOUSEBUTTONDOWN. Обрабатывает события нажатий клавиш мыши и их позицию на окне программы, выводит информацию на консоль.

Напишите программу, запустите и поэкспериментируйте нажатиями разных клавиш.

Список основных типов событий

1. QUIT: Событие, возникающее при закрытии окна приложения.

2. KEYDOWN: Событие нажатия клавиши.

3. KEYUP: Событие отпускания клавиши.

4. MOUSEBUTTONDOWN: Событие нажатия кнопки мыши.

5. MOUSEBUTTONUP: Событие отпускания кнопки мыши.

6. MOUSEMOTION: Событие движения мыши.

7. JOYAXISMOTION: Событие изменения положения оси джойстика.

8. JOYBALLMOTION: Событие движения шарикового контроллера (если он есть).

9. JOYHATMOTION: Событие изменения положения хэтч-контроллера (если он есть).

10. JOYBUTTONDOWN: Событие нажатия кнопки на джойстике.

11. JOYBUTTONUP: Событие отпускания кнопки на джойстике.

12. VIDEORESIZE: Событие изменения размера окна.

13. VIDEOEXPOSE: Событие, связанное с обновлением области окна.

14. USEREVENT: Пользовательское событие, которое можно использовать для создания собственных событий.

Пример второй

Так как в играх есть очень важные кнопки для движения вверх, вниз, влево, вправо — это стрелки и буквы ‘w’, ‘s’, ‘a’, ‘d’. Предлагаю написать программу, где мы отследим их нажатия и выведем на консоль. Отслеживать будем с помощью типа события нажатия клавиши (KEYDOWN) и дополнительных данных из переменной key.

    # 1-й Раздел ----- Обработка событий -----------     for e in pygame.event.get():         if e.type == pygame.QUIT:             run = False         elif e.type == pygame.KEYDOWN:             if e.key == pygame.K_UP or e.key == pygame.K_w:                 print(f'Движение вверх, клавиша: {pygame.key.name(e.key)}')             if e.key == pygame.K_DOWN or e.key == pygame.K_s:                 print(f'Движение вниз, клавиша: {pygame.key.name(e.key)}')             if e.key == pygame.K_LEFT or e.key == pygame.K_a:                 print(f'Движение влево, клавиша: {pygame.key.name(e.key)}')             if e.key == pygame.K_RIGHT or e.key == pygame.K_d:                 print(f'Движение вправо, клавиша: {pygame.key.name(e.key)}')     # -----------------------------------------------

Все поля и методы используемые в этой программе мы уже знаем.

Могу предложить вам задачу! Необходимо написать программу, которая отследит клавиши с помощью событий  и напишет в консоле слово:  pygame. Но писать необходимо функцией  pygame.key.name() (что делает эта функция мы разобрали). Чтобы выполнить это задание, так же надо знать аргументы функции print()end и sep,  переопределить их (по умолчанию end = '\n' , sep = ' ').

Если вы сможете сделать это задание, то будем считать, что начальное понимание событий у вас есть!

ЗЫ.

Хочу напомнить, что мои статьи пишутся для тех, кто начал изучать python. Для тех, у кого установлен python3, IDE и сам модуль pygame. Модуль pygame мы используем как платформу для обучения и не более. Профессионалов, прошу не отворачиваться от начинающих а конструктивно помогать, указывать на неточности или ошибки, которые я допущу. 

Следующая статья будет посвящена продолжению изучению событий. Тема большая и интересная!

Всем спасибо!

Оглавление

Pygame для начинающих программистов. Статья первая
Pygame для начинающих программистов. Статья вторая. События


ссылка на оригинал статьи https://habr.com/ru/articles/858050/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *