Pygame для начинающих программистов.Статья вторая. События
В первой статье мы определились с каркасом программы, разобрали ее структуру и разложили по блокам. В этой статье для нас будет интересен главный игровой цикл.
Разделим его на три условных раздела:
Обработка событий. Причем этот раздел желательно помещать в начале игрового цикла!
Описание логики игры. Эта самая сложная и наиболее важная часть.
Отображение графики. Здесь у нас визуализация, графика, анимация.
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
, переопределить его (по умолчанию end = ‘\n’
)
Если вы сможете сделать это задание, то будем считать, что начальное понимание событий у вас есть!
ЗЫ.
Хочу напомнить, что мои статьи пишутся для тех, кто начал изучать python
. Для тех, у кого установлен python3
, IDE и сам модуль pygame
. Модуль pygame
мы используем как платформу для обучения и не более. Профессионалов, прошу не отворачиваться от начинающих, а конструктивно помогать, указывать на неточности или ошибки, которые я допущу.
Следующая статья будет посвящена продолжению изучению событий. Тема большая и интересная!
Всем спасибо!