Это первая часть серии руководств «Разработка игр с помощью Pygame». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python.
Код в уроках был написан на Python 3.7 и Pygame 1.9.6
Что такое Pygame?
Pygame — это «игровая библиотека», набор инструментов, помогающих программистам создавать игры. К ним относятся:
- Графика и анимация
- Звук (включая музыку)
- Управление (мышь, клавиатура, геймпад и так далее)
Игровой цикл
В сердце каждой игры лежит цикл, который принято называть «игровым циклом». Он запускается снова и снова, делая все, чтобы работала игра. Каждый цикл в игре называется кадром.
В каждом кадре происходит масса вещей, но их можно разбить на три категории:
Речь идет обо всем, что происходит вне игры — тех событиях, на которые она должна реагировать. Это могут быть нажатия клавиш на клавиатуре, клики мышью и так далее.
КАК ИСПОЛЬЗОВАТЬ ИВЕНТЫ В АСИНХРОННОСТИ ПИТОНА. EVENTS В ASYNCIO
Изменение всего, что должно измениться в течение одного кадра. Если персонаж в воздухе, гравитация должна потянуть его вниз. Если два объекта встречаются на большой скорости, они должны взорваться.
В этом шаге все выводится на экран: фоны, персонажи, меню. Все, что игрок должен видеть, появляется на экране в нужном месте.
Время
Еще один важный аспект игрового цикла — скорость его работы. Многие наверняка знакомы с термином FPS, который расшифровывается как Frames Per Second (или кадры в секунду). Он указывает на то, сколько раз цикл должен повториться за одну секунду. Это важно, чтобы игра не была слишком медленной или быстрой. Важно и то, чтобы игра не работала с разной скоростью на разных ПК.
Если персонажу необходимо 10 секунд на то, чтобы пересечь экран, эти 10 секунд должны быть неизменными для всех компьютеров.
Создание шаблона Pygame
Теперь, зная из каких элементов состоит игра, можно переходить к процессу написания кода. Начать стоит с создания простейшей программы pygame, которая всего лишь открывает окно и запускает игровой цикл. Это отправная точка для любого проекта pygame.
В начале программы нужно импортировать необходимые библиотеки и задать базовые переменные настроек игры:
# Pygame шаблон — скелет для нового проекта Pygame import pygame import random WIDTH = 360 # ширина игрового окна HEIGHT = 480 # высота игрового окна FPS = 30 # частота кадров в секунду
Дальше необходимо открыть окно игры:
# создаем игру и окно pygame.init() pygame.mixer.init() # для звука screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption(«My Game») clock = pygame.time.Clock()
pygame.init() — это команда, которая запускает pygame. screen — окно программы, которое создается, когда мы задаем его размер в настройках. Дальше необходимо создать clock , чтобы убедиться, что игра работает с заданной частотой кадров.
Теперь необходимо создать игровой цикл:
Pygame Event Handler Explained
# Цикл игры running = True while running: # Ввод процесса (события) # Обновление # Визуализация (сборка)
Игровой цикл — это цикл while , контролируемый переменной running . Если нужно завершить игру, необходимо всего лишь поменять значение running на False . В результате цикл завершится. Теперь можно заполнить каждый раздел базовым кодом.
Раздел рендеринга (отрисовки)
Начнем с раздела отрисовки. Персонажей пока нет, поэтому экран можно заполнить сплошным цветом. Чтобы сделать это, нужно разобраться, как компьютер обрабатывает цвета.
Экраны компьютеров сделаны из пикселей, каждый из которых содержит 3 элемента: красный, зеленый и синий. Цвет пикселя определяется тем, как горит каждый из элементов:
Каждый из трех основных цветов может иметь значение от 0 (выключен) до 255 (включен на 100%), так что для каждого элемента есть 256 вариантов.
Узнать общее количество отображаемых компьютером цветов можно, умножив:
>>> 256 * 256 * 256 16,777,216
Теперь, зная, как работают цвета, можно задать их в начале программ:
# Цвета (R, G, B) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255)
А после этого — заполнить весь экран.
# Рендеринг screen.fill(BLACK)
Но этого недостаточно. Дисплей компьютера работает не так. Изменить пиксель — значит передать команду видеокарте, чтобы она передала соответствующую команду экрану. По компьютерным меркам это очень медленный процесс. Если нужно нарисовать на экране много всего, это займет много времени.
Исправить это можно оригинальным способом, который называется — двойная буферизация. Звучит необычно, но вот что это такое.
Представьте, что у вас есть двусторонняя доска, которую можно поворачивать, показывая то одну, то вторую сторону. Одна будет дисплеем (то, что видит игрок), а вторая — оставаться скрытой, ее сможет «видеть» только компьютер. С каждым кадром рендеринг будет происходить на задней части доски. Когда отрисовка завершается, доска поворачивается и ее содержимое демонстрируется игроку.
А это значит, что процесс отрисовки происходит один раз за кадр, а не при добавлении каждого элемента.
В pygame это происходит автоматически. Нужно всего лишь сказать доске, чтобы она перевернулась, когда отрисовка завершена. Эта команда называется flip() :
# Рендеринг screen.fill(BLACK) # после отрисовки всего, переворачиваем экран pygame.display.flip()
Главное — сделать так, чтобы функция flip() была в конце. Если попытаться отрисовать что-то после поворота, это содержимое не отобразится на экране.
Раздел ввода (событий)
Игры еще нет, поэтому пока сложно сказать, какие кнопки или другие элементы управления понадобятся. Но нужно настроить одно важное событие. Если попытаться запустить программу сейчас, то станет понятно, что нет возможности закрыть окно. Нажать на крестик в верхнем углу недостаточно. Это тоже событие, и необходимо сообщить программе, чтобы она считала его и, соответственно, закрыла игру.
События происходят постоянно. Что, если игрок нажимает кнопку прыжка во время отрисовки? Это нельзя игнорировать, иначе игрок будет разочарован. Для этого pygame сохраняет все события, произошедшие с момента последнего кадра. Даже если игрок будет лупить по кнопкам, вы не пропустите ни одну из них.
Создается список, и с помощью цикла for можно пройтись по всем из них.
for event in pygame.event.get(): # проверить закрытие окна if event.type == pygame.QUIT: running = False
В pygame много событий, на которые он способен реагировать. pygame.QUIT — событие, которое стартует после нажатия крестика и передает значение False переменной running , в результате чего игровой цикл заканчивается.
Контроль FPS
Пока что нечего поместить в раздел Update (обновление), но нужно убедиться, что настройка FPS контролирует скорость игры. Это можно сделать следующим образом:
while running: # держим цикл на правильной скорости clock.tick(FPS)
Команда tick() просит pygame определить, сколько занимает цикл, а затем сделать паузу, чтобы цикл (целый кадр) длился нужно время. Если задать значение FPS 30, это значит, что длина одного кадра — 1/30, то есть 0,03 секунды. Если цикл кода (обновление, рендеринг и прочее) занимает 0,01 секунды, тогда pygame сделает паузу на 0,02 секунды.
Итог
Наконец, нужно убедиться, что когда игровой цикл завершается, окно игры закрывается. Для этого нужно поместить функцию pygame.quit() в конце кода. Финальный шаблон pygame будет выглядеть вот так:
# Pygame шаблон — скелет для нового проекта Pygame import pygame import random WIDTH = 360 HEIGHT = 480 FPS = 30 # Задаем цвета WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # Создаем игру и окно pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption(«My Game») clock = pygame.time.Clock() # Цикл игры running = True while running: # Держим цикл на правильной скорости clock.tick(FPS) # Ввод процесса (события) for event in pygame.event.get(): # check for closing window if event.type == pygame.QUIT: running = False # Обновление # Рендеринг screen.fill(BLACK) # После отрисовки всего, переворачиваем экран pygame.display.flip() pygame.quit()
Ура! У вас есть рабочий шаблон Pygame. Сохраните его в файле с понятным названием, например, pygame_template.py , чтобы можно было использовать его каждый раз при создании нового проекта pygame.
В следующем руководстве этот шаблон будет использован как отправная точка для изучения процесса отрисовки объектов на экране и их движения.
Источник: pythonru.com
For event in pygame event get что это за программа
Доброго времени суток, уважаемые участники ресурса GcUp!
В этой статье рассмотрим события в PyGame.
for event in pygame.event.get():
Как видно для того чтобы пройтись по всему списку объектов возвращенных методом pygame.event.get мы ввели итератор event. В теле цикла мы можем сравнивать тип события и таким образом можем обрабатывать связанные с этим типом события.
Для примера давайте обработаем тип события MOUSEBUTTONDOWN. Для начала откроем созданный нами раньше шаблон pygame_template.py и сохраним его под именем pygame_event.py и изменим значение заголовка окна на “PyGame Event”. Теперь надо разобраться с тем как мы будем обрабатывать событие, из названия MOUSEBUTTONDOWN понятно, то, что это событие связано с нажатием кнопки мыши, для обработки этого события мы будем рисовать красный круг там, где пользователь нажал левую кнопку мыши, для этого введем три переменные: circle_radius – радиус круга, circle_color – цвет круга, circle_pos – позиция центра круга, для этого в блоке инициализации пишем следующих код:
circle_pos = (0,0)
circle_color = (255, 0, 0)
circle_radius = 10
Теперь в телецикла с итератором event надо сравнить тип события с MOUSEBUTTONDOWN, если тип события равен MOUSEBUTTONDOWN то этого события есть атрибут button, теперь уже надо сравнить этот атрибут к значением левой кнопки мыши, левая кнопка мыши имеет значение 1, если значение атрибута button равно 1, то можно присвоить переменной circle_pos значение атрибута позиции мыши pos, вот весь код обработки события MOUSEBUTTONDOWN:
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
circle_pos = event.pos
Осталось только нарисовать круг в блоке формирования кадра, рисовать круг будет методом pygame.draw.circle, этот метод мы с вами уже разобрали в предыдущей статье, собственно вот весь код формирования кадра:
pygame.draw.circle(screen, circle_color, circle_pos, circle_radius);
Теперь можно запустить код и проверить что получилось. Как видно круг красного цвета рисуется на том месте, где пользователь последний раз нажал левую кнопку мыши.
Ну а теперь давайте обработаем событие, связанное с клавиатурой, давайте обработаем тип события KEYDOWN, давайте сделаем, так что при нажатии на клавишу “Esc” программа закрывалась. Первое что нам надо это узнать является ли событие типа KEYDOWN, в блоке цикла с итератором event пишем:
if event.type == KEYDOWN:
Условие готово, осталось только сравнить атрибут key с клавишей “Esc”, код этой клавиши в PyGame равен константе “K_ESCAPE” (набор всех констант клавиш можно узнать в модуле Key), если атрибут key равен “K_ESCAPE” то снимаем флаг mainLoop, если этот фланг не установлен то программа закроется, вот код из блока предыдущего условия:
if event.key == K_ESCAPE:
mainLoop = False
pygame.event.set_blocked(MOUSEBUTTONDOWN)
Теперь можно проверить заблокировано событие или нет, запускаем и пробуем нажимать правую кнопку мыши, как видно ничего не происходит, код обработка события есть, но оно не обрабатывается, так как типа этого события нет в очереди событий.
Давайте теперь проверим, как работает вторая реализация этого метода, передадим в этот метод список из двух элементов MOUSEBUTTONDOWN и KEYDOWN, изменим код выше на этот код:
pygame.event.set_blocked([MOUSEBUTTONDOWN, KEYDOWN])
block_flag = False
Теперь надо сравнить атрибут key с клавишей Space, сам блок обработки события KEYDOWN уже есть, теперь надо сравнить атрибут, так что пишем код в блоке обработки события KEYDOWN:
if event.key == K_SPACE:
Далее следует присвоит флагу block_flag отрицание, то есть если флаг содержал значение True то теперь он будет содержать False и наоборот если содержал False то теперь будет содержать True:
block_flag = not block_flag
Можно еще вывести в терминал интерпретатора данные строку, по которым можно узнать заблокировано событие или нет:
print ‘MOUSEBUTTONDOWN is block: ‘, block_flag
Теперь в зависимости от значения флага block_flag будем блокировать или разблокировать событие MOUSEBUTTONDOWN:
if block_flag:
pygame.event.set_blocked(MOUSEBUTTONDOWN)
else:
pygame.event.set_allowed(MOUSEBUTTONDOWN)
Ну а теперь настал момент проверки, запускаем, как видим все работает, жмем на Space и блокируем/разблокируем добавление события MOUSEBUTTONDOWN в очередь событий, в терминал интерпретатора также выводится информация о том заблокировано событие MOUSEBUTTONDOWN или нет.
Давайте теперь рассмотрим метод, по которому мы можем узнать заблокирован тип события или нет, рассмотрим метод pygame.event.get_blocked(type): return bool, тут type – тип события, метод возвращает логическое значение в зависимости от того заблокировано событие или нет.
Давайте используем его на практике, удалим следующий код, в котором выводим в терминал информацию о том, заблокировано событие или нет:
print ‘MOUSEBUTTONDOWN is block: ‘, block_flag
И заменим его на код с методом pygame.event.get_blocked:
print ‘MOUSEBUTTONDOWN is block: ‘, pygame.event.get_blocked(MOUSEBUTTONDOWN)
Запустим и протестируем, как видим ничего не произошло, а это хорошо и значит, то, что все работает как надо.
В целом у нас должен получится следующий код в файле pygame_event.py:
Код можно просмотреть здесь.
Ну а теперь займемся методом pygame.event.pump. Этот метод используется в том случае, если не требуется писать обработчиков событий, например если мы проигрываем анимацию передвижения объекта с одного места в другое, то писать обработчики событий нет смысла, но если мы не будем очищать очередь событий или передавать эту очередь другим программам, то наша программа зависнет, так как выполняется бесконечный цикл. Для этого чтобы программа не зависла надо отправить очередь другим программам. На помощь нам приходит следующий метод pygame.event.pump. Этот метод ничего не принимает в качестве параметров и ничего не возвращает.
Давайте попробуем этот метод на практике, открываем шаблон pygame_template.py и сохраняем его под именем pygame_event_1.py и поменяем заголовок окна на “PyGame Event”. Теперь настало время, удалить цикл, в котором итератор event проходит по всем событиям, возвращаемых методом pygame.event.get. Если сейчас запустить программу то она зависнет, попробуйте это сделать. Как видно программа действительно зависает, для того чтобы убрать завившею программу надо перезагрузить интерпретатор через меню “Shell”.
Теперь давайте добавим место цикла метод pygame.event.pump:
pygame.event.pump()
if pygame.event.peek(QUIT):
mainLoop = False
pygame.event.clear()
Как видно из кода, мы вначале узнали, есть ли данный тип события в очереди, если он есть, то убираем флаг главного цикла, а после условия очищаем очередь, так как нам надо заботится о переполнении очереди.
Можно запустить и проверить работает закрытие программы или нет. Как видно работает, в итоге должен быть написан следующий код в файле pygame_event1.py:
Код можно просмотреть здесь.
- Основы PyGame. Введение.
- PyGame. Геометрические примитивы. Часть 1.
- PyGame. Геометрические примитивы. Часть 2.
- PHP введение. Часть 1
- Game maker. Основы. Создание игры. Часть 1
- Game maker. Основы. Создание игры. Часть 2
- Game maker. Основы. Создание игры. Часть 3
- Game Maker для абсолютных новичков! №1/2
- Game Maker для абсолютных новичков! №2/2
- Программирование в Leadwerks на LUA. Введение
- Как разработать RPG-игру за неделю с нуля и без бюджета. Часть I
- Как разработать RPG-игру за неделю с нуля и без бюджета. Часть II
- Основы PyGame. Прямоугольные области в PyGame. Часть первая.
- Основы PyGame. Прямоугольные области в PyGame. Часть вторая.
- Курс GML. Часть 1 — введение.
- Основы PyGame. Загрузка, сохранение и обработка изображений
- Урок по основам Golden T Game Engine
- GML: Переменные, арифметические операции.
- GML: Условия, циклы
- Game Maker Studio. Физика. Урок 1: Основы.
Порядок вывода комментариев:
Источник: gcup.ru
PyGame Основы часть 3. Анимация и события
В этой статье мы разберём как происходит анимация в PyGame и также не много затроним работу с события ми в библиотеки.
Также перед прочтением этой стать, рекомендую прочитать предыдущие, чтобы лучше понимать здесь написанное:
- Основы Python библиотеки PyGame, Часть 1;
- Pygame основы часть 2, Создание фигур;
Как сделать анимацию в PyGame:
Для начала, чтобы всё наиболее наглядно показать, сделаем несколько переменных, вот они:
# Позиция объекта по X
# Позиция объекта по Y
# Скорость объекта
# Ширина окна
screenWidth = 500
# Высота окна
screenHeight = 400
screen = pygame . display . set_mode ( ( screenWidth , screenHeight ) )
clock = pygame . time . Clock ( )
Как вы видите, в начале мы сделали переменные для назначения позиции по осям X и Y, потом назначили скорость при которой будет у нас перемешаться объект.
Также назначили ширину и высоту окна, это для удобства, так как он нам ещё пригодиться, создали окно и назначили таймер, он нам пригодиться для назначения FPS.
Вот основной код программы:
while True :
# Назначим FPS
clock . tick ( 60 )
# Закрашиваем весь экран в чёрный
screen . fill ( BLACK )
# Проверка позиции
if posX + 30 + 50 < screenWidth and posY — 30 — 50 <= 0 :
posX += speed
elif posX + 30 + 50 >= screenWidth and posY + 30 + 50 < screenHeight :
posY += speed
elif posX — 30 — 50 >= 0 and posY + 30 + 50 >= screenHeight :
posX -= speed
elif posX — 30 — 50 <= 0 and posY — 30 — 50 >0 :
posY -= speed
# Создание шара
pygame . draw . circle ( screen , GREEN , ( posX , posY ) , 60 )
# Проверка событий
for event in pygame . event . get ( ) :
if event . type == pygame . QUIT :
pygame . quit ( )
# Обновление экрана
pygame . display . update ( )
Как видите в начале мы назначаем FPS, потом весь экран заливаем чёрным цветом, это нужно, так как суть анимации будет в том, что мы весь экран заливаем чёрным и потом рисуем объект с новой позицией, тем самым он перемешается.
Потом идёт несколько условий, зависимо от него, мы будем увеличивать или уменьшать определённую переменную которая отвечает за позицию. Условия таковы, что круг у нас будет двигаться по часовой стрелки, по квадратному пути и он должен быть не ближе к краям окна чем на 50 пикселей.
Потом создаём шар, как это делать вы узнает ев прошлой части, также переменную для цвета назначали тоже в прошлой.
Потом идёт проверка событий, у нас она пока отвечает только за закрытие программы, но об этом ниже.
Последние обновляем весь экран, или всё прорисовываем, теперь запускаем программу и шар должен перемешаться как показано ниже:
Если у вас всё работает так же, то значит всё сделано правильно. Как вы наверное уже поняли, суть создания анимации, что мы просто меняем параметр объекта и всё перерисовываем заново, не забыв перед этим всё стереть.
Обработка событий в PyGame:
Чтобы показать более наглядно обработчик событий в PyGame, немного изменю основной код программы, который был показан выше.
while True :
clock . tick ( 60 )
screen . fill ( BLACK )
for event in pygame . event . get ( ) :
if event . type == pygame . QUIT :
pygame . quit ( )
elif event . type == pygame . KEYDOWN :
if event . key == pygame . K_LEFT :
posX -= speed
elif event . key == pygame . K_RIGHT :
posX += speed
elif event . key == pygame . K_UP :
posY -= speed
elif event . key == pygame . K_DOWN :
posY += speed
pygame . draw . circle ( screen , GREEN , ( posX , posY ) , 60 )
pygame . display . update ( )
Как видите мы убрали условия и рендеринг шара поставили в низ, перед обновлением экрана.
Для обработки событий мы используем цикл for , который проходиться по pygame.event.get() , эта функция возвращает словарь данных о событие которое происходит прямо сейчас.
Внутри цикла мы уже используем одно условие для проверки выхода из программы/игры, это pygame.QUIT , внутри условия мы выходим из программы.
Параметр type , словаря event хранит тип события, поэтому если нужно проверить тип, проверяем его.
Следующие условие проверяет нажатие клавиш на клавиатуре, внутри есть ещё условия, которые проверяют какая конкретна была нажата клавиша, параметр key , словаря event хранит номер клавиши.
В этих условиях мы проверяем, что были нажаты именно стрелки, и как видите, при нажатие стрелок мы меняем координаты нашего шара.
Это вот кратко как обрабатывать событие, то есть, вам нужен цикл который проходиться по словарю который хранит данные о событие, который возвращает метод pygame.event.get() , и параметр этого словаря type , он хранит тип события.
Вывод:
В этой статье вы прочитали про как происходит анимация в PyGame, и немного узнали про работу с событиями. Эта была заключительная часть из цикла статей, про основы PyGame, этих знаний должно хватить, чтобы сделать простую игру.
Источник: prognote.ru
pygame
Обработка событий
Pygame будет регистрировать все события от пользователя в очередь событий, которые могут быть получены с помощью кода pygame.event.get() . Каждый элемент в этой очереди является объектом Event и все они будут иметь type атрибута, который представляет собой целое число, представляющее, какое событие он имеет. В модуле pygame есть предопределенные целочисленные константы, представляющие тип. За исключением этого атрибута, события имеют разные атрибуты.
УВОЛИТЬСЯ | никто |
ActiveEvent | прибыль, состояние |
KeyDown | unicode, key, mod |
KeyUp | ключ, мода |
MOUSEMOTION | pos, rel, кнопки |
MOUSEBUTTONUP | pos, кнопка |
MOUSEBUTTONDOWN | pos, кнопка |
JOYAXISMOTION | радость, ось, значение |
JOYBALLMOTION | радость, мяч, rel |
JOYHATMOTION | радость, шляпа, ценность |
JOYBUTTONUP | радость, кнопка |
JOYBUTTONDOWN | радость, кнопка |
VIDEORESIZE | размер, w, h |
VIDEOEXPOSE | никто |
USEREVENT | код |
пример
Чтобы обрабатывать наши события, мы просто просматриваем очередь, проверяем, какой тип (с помощью предопределенных констант в модуле pygame), а затем выполняем некоторые действия. Этот код проверяет, нажал ли пользователь кнопку закрытия в верхнем углу дисплея, и если это так прекратит работу программы.
for event in pygame.event.get(): if event.type == pygame.QUIT: # Close the program any way you want, or troll users who want to close your program. raise SystemExit
ВНИМАНИЕ : вы должны регулярно вызывать очередь событий при использовании pygame! Помимо выборки доступных событий, вызов очереди событий также является способом взаимодействия pygame с операционной системой. Если очередь событий не вызывается регулярно, ваша операционная система будет считать, что ваша программа больше не работает, и, возможно, она выглядит так, как если бы программа потерпела крах (в Windows это окно становится белым). Если вы не хотите ничего делать с событиями, вы должны вызвать pygame.event.pump() каждый цикл игры, чтобы pygame обрабатывал события внутри.
События на клавиатуре
В pygame есть два типа ключевых событий: KEYDOWN и KEYUP . Эти события имеют key атрибута, который является целым числом, представляющим ключ на клавиатуре. Модуль pygame имеет предопределенные целочисленные константы, представляющие все общие ключи. Константы называются с капиталом K , подчеркиванием и именем ключа. Например,
пример
Этот код проверяет, нажал ли пользователь w , a , s или d .
for event in pygame.event.get(): if event.type == pygame.QUIT: # Usually wise to be able to close your program. raise SystemExit elif event.type == pygame.KEYDOWN: if event.key == pygame.K_w: print(«Player moved up!») elif event.key == pygame.K_a: print(«Player moved left!») elif event.key == pygame.K_s: print(«Player moved down!») elif event.key == pygame.K_d: print(«Player moved right!»)
Модификаторы
Для заглавных букв нет целочисленной константы.
Вместо этого ключевые события имеют еще один атрибут mod , который является модификатором ( shift , ctrl , alt и т. Д.) Одновременно нажатием клавиши. Атрибут mod — это целое число, представляющее нажатие модификатора. Каждое целое значение модификатора сохраняется в модуле pygame под именем KMOD_ и их именем. Например, сдвиг влево называется KMOD_LSHIFT , Tab имеет имя KMOD_TAB а Ctrl — KMOD_CTRL .
пример
Этот код проверяет, нажал ли пользователь a , сдвиг влево + a или Caps + a .
for event in pygame.event.get(): if event.type == pygame.QUIT: # It’s still wise to be able to close your program. raise SystemExit elif event.type == pygame.KEYDOWN: if event.key == pygame.K_a: if event.mod == 0: # No modifier. print(«You pressed ‘a'») elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS: print(«You pressed ‘A'») else: print(«You pressed ‘a’ with another modifier than right shift or caps.»)
События мыши
Существует три типа событий мыши в pygame MOUSEMOTION , MOUSEBUTTONDOWN и MOUSEBUTTONUP . Pygame зарегистрирует эти события, когда установлен режим отображения.
MOUSEMOTION принимается, когда пользователь перемещает свою или ее мышь на дисплей. Он имеет buttons атрибутов, pos и rel .
- buttons представляют собой кортеж, представляющий нажатие кнопок мыши ( left , mouse-wheel , right ) или нет.
- pos — абсолютное положение ( x , y ) курсора в пикселях.
- rel — позиция относительно предыдущей позиции ( rel_x , rel_y ) в пикселях.
MOUSEBUTTONDOWN и MOUSEBUTTONUP принимаются, когда пользователь нажимает или отпускает кнопку мыши. У них есть button атрибутов и pos .
- button представляет собой целое число, представляющее нажатую кнопку. 1 для левой кнопки, 2 для колесика мыши и 3 для правой кнопки.
- pos — это абсолютное положение мыши ( x , y ), когда пользователь нажал кнопку мыши.
пример
Вот краткий пример использования некоторых атрибутов каждого события мыши:
for event in pygame.event.get(): if event.type == pygame.QUIT: # Close your program if the user wants to quit. raise SystemExit elif event.type == pygame.MOUSEMOTION: if event.rel[0] > 0: # ‘rel’ is a tuple (x, y). ‘rel[0]’ is the x-value. print(«You’re moving the mouse to the right») elif event.rel[1] > 0: # pygame start y=0 at the top of the display, so higher y-values are further down. print(«You’re moving the mouse down») elif event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: print(«You pressed the left mouse button») elif event.button == 3: print(«You pressed the right mouse button») elif event.type == pygame.MOUSEBUTTONUP: print(«You released the mouse button»)
Поскольку в модуле pygame нет предопределенных констант для атрибута кнопки мыши, вот значения для каждого:
Левую кнопку мыши | 1 |
Кнопка мыши | 2 |
Правая кнопка мыши | 3 |
Колесо мыши прокручивается вверх | 4 |
Колесо мыши прокручивается вниз | 5 |
При прокрутке кнопки мыши будут генерироваться pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP .
Проверка состояния
Вы можете вызвать функции из модуля pygame.key и pygame.mouse для получения состояния клавиши и мыши. Тем не менее, это не рекомендуемый способ обработки событий в pygame, поскольку есть некоторые недостатки:
- Вы получите состояния при вызове функции, что означает, что вы можете пропустить события между вызовами, если пользователь быстро нажимает кнопки.
- Вы не можете определить порядок событий.
- Вам все равно нужно вызвать одну из функций события pygame для pygame, чтобы внутренне взаимодействовать с операционной системой, иначе он предупредит, что программа перестала отвечать на запросы. Функции, которые вы можете вызвать:
- pygame.event.get() чтобы получить все события или типы событий (путем передачи типов в качестве аргумента) из очереди.
- pygame.event.poll() чтобы получить одно событие из очереди.
- pygame.event.wait() чтобы ждать одного события из очереди.
- pygame.event.clear() чтобы очистить все события в очереди.
- pygame.event.pump() чтобы позволить pygame обрабатывать внутренние действия (называется неявно указанными выше функциями).
События на клавиатуре
Ключевой модуль имеет функцию pygame.key.get_pressed() которая возвращает список состояний всех ключей. Список содержит 0 для всех клавиш, которые не нажаты, и 1 для всех нажатых клавиш. Его индекс в списке определяется константами в модуле pygame, все с префиксом K_ и именем ключа.
pygame.event.pump() # Allow pygame to handle internal actions. key = pygame.key.get_pressed() if key[pygame.K_a]: print(«You pressed ‘a'») if key[pygame.K_F1]: print(«You pressed ‘F1′») if key[pygame.K_LSHIFT]: print(«You pressed ‘left shift'») if key[pygame.K_q]: # Press ‘q’ to exit the program quit()
Если вы хотите проверить одно нажатие клавиши, а не удерживать клавишу, вы можете сохранить предыдущее состояние всех ключей во временной переменной и проверить, изменяется ли значение:
pygame.event.pump() # Allow pygame to handle internal actions. key = pygame.key.get_pressed() if key[pygame.K_q] and not previous_key[pygame.K_q]: print(«You pressed ‘q'») if key[pygame.K_p] and not previous_key[pygame.K_p]: print(«You pressed ‘p'») previous_key = key
Оператор оценивает значение true только тогда, когда текущая клавиша нажата, а предыдущая клавиша не нажата. Чтобы проверить, освободил ли пользователь ключ, вам нужно переключить ключевое слово not ( if not key[pygame.K_q] and previous_key[pygame.K_q] ). Для правильной работы вам необходимо установить переменную previous_key = pygame.key.get_pressed() перед игровым циклом, иначе вы получите NameError .
События мыши
Модуль мыши имеет функции, которые позволяют нам проверять и устанавливать положение мыши, а также проверять нажатые кнопки. Функция pygame.mouse.get_pressed() возвращает кортеж кортежа, представляющий, если pygame.mouse.get_pressed() кнопки мыши (левое, колесико мыши, справа) или нет.
pygame.event.pump() # Allow pygame to handle internal actions. mouse_pos = pygame.mouse.get_pos() mouse_buttons = pygame.mouse.get_pressed() if mouse_pos[0] > 100: pygame.mouse.set_pos(10, mouse_pos[1]) # Reset the mouse’s x-position to 10. print(«YOU SHALL NOT PASS!») if mouse_buttons[2]: print(«I’m right, right?») if mouse_buttons[0]: # Press left mouse button to exit. print(«Program left») quit()
Источник: learntutorials.net