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