В первой статье мы определились с каркасом программы, разобрали ее структуру и разложили по блокам. В этой статье для нас будет интересен главный игровой цикл.
Разделим его на три условных раздела:
-
Обработка событий. Причем этот раздел желательно помещать в начале игрового цикла!
-
Описание логики игры. Эта самая сложная и наиболее важная часть.
-
Отображение графики. Здесь у нас визуализация, графика, анимация.
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/
Добавить комментарий