Pygame event get что это
PyGame Основы часть 3. Анимация и события
В этой статье мы разберём как происходит анимация в PyGame и также не много затроним работу с события ми в библиотеки.
Также перед прочтением этой стать, рекомендую прочитать предыдущие, чтобы лучше понимать здесь написанное:
Как сделать анимацию в PyGame:
Для начала, чтобы всё наиболее наглядно показать, сделаем несколько переменных, вот они:
Как вы видите, в начале мы сделали переменные для назначения позиции по осям X и Y, потом назначили скорость при которой будет у нас перемешаться объект.
Также назначили ширину и высоту окна, это для удобства, так как он нам ещё пригодиться, создали окно и назначили таймер, он нам пригодиться для назначения FPS.
Вот основной код программы:
Как видите в начале мы назначаем FPS, потом весь экран заливаем чёрным цветом, это нужно, так как суть анимации будет в том, что мы весь экран заливаем чёрным и потом рисуем объект с новой позицией, тем самым он перемешается.
Потом идёт несколько условий, зависимо от него, мы будем увеличивать или уменьшать определённую переменную которая отвечает за позицию. Условия таковы, что круг у нас будет двигаться по часовой стрелки, по квадратному пути и он должен быть не ближе к краям окна чем на 50 пикселей.
Потом создаём шар, как это делать вы узнает ев прошлой части, также переменную для цвета назначали тоже в прошлой.
Потом идёт проверка событий, у нас она пока отвечает только за закрытие программы, но об этом ниже.
Последние обновляем весь экран, или всё прорисовываем, теперь запускаем программу и шар должен перемешаться как показано ниже:
Если у вас всё работает так же, то значит всё сделано правильно. Как вы наверное уже поняли, суть создания анимации, что мы просто меняем параметр объекта и всё перерисовываем заново, не забыв перед этим всё стереть.
Обработка событий в PyGame:
Чтобы показать более наглядно обработчик событий в PyGame, немного изменю основной код программы, который был показан выше.
Как видите мы убрали условия и рендеринг шара поставили в низ, перед обновлением экрана.
В этих условиях мы проверяем, что были нажаты именно стрелки, и как видите, при нажатие стрелок мы меняем координаты нашего шара.
Вывод:
В этой статье вы прочитали про как происходит анимация в PyGame, и немного узнали про работу с событиями. Эта была заключительная часть из цикла статей, про основы PyGame, этих знаний должно хватить, чтобы сделать простую игру.
Pygame event get что это
Pygame handles all its event messaging through an event queue. The routines in this module help you manage that event queue. The input queue is heavily dependent on the pygame.display pygame module to control the display window and screen module. If the display has not been initialized and a video mode not set, the event queue may not work properly. The event subsystem should be called from the main thread. If you want to post events into the queue from other threads, please use the pygame.fastevent pygame module for interacting with events and queues module.
The event queue contains pygame.event.EventType pygame object for representing events event objects. There are a variety of ways to access the queued events, from simply checking for the existence of events, to grabbing them directly off the stack. The event queue also offers some simple filtering which can slightly help performance by blocking certain event types from the queue. Use pygame.event.set_allowed() control which events are allowed on the queue and pygame.event.set_blocked() control which events are allowed on the queue to change this filtering. By default, all event types can be placed on the queue.
All pygame.event.EventType pygame object for representing events instances contain an event type identifier and attributes specific to that event type. The event type identifier is accessible as the pygame.event.EventType.type event type identifier. property. Any of the event specific attributes can be accessed through the pygame.event.EventType.__dict__ event attribute dictionary attribute or directly as an attribute of the event object (as member lookups are passed through to the object’s dictionary values). The event object has no method functions. Users can create their own new events with the pygame.event.Event() create a new event object function.
Events support equality and inequality comparisons. Two events are equal if they are the same type and have identical attribute values.
While debugging and experimenting, you can print an event object for a quick display of its type and members. The function pygame.event.event_name() get the string name from an event id can be used to get a string representing the name of the event type.
Events that come from the system will have a guaranteed set of member attributes based on the type. The following is a list event types with their specific attributes.
Changed in pygame 2.0.0: The joy attribute was deprecated, instance_id was added.
Changed in pygame 2.0.1: The unicode attribute was added to KEYUP event.
On MacOSX when a file is opened using a pygame application, a USEREVENT with its code attribute set to pygame.USEREVENT_DROPFILE is generated. There is an additional attribute called filename where the name of the file being accessed is stored.
When compiled with SDL2, pygame has these additional events and their attributes.
Changed in pygame 2.0.2: Fixed amount horizontal scroll (x, positive to the right and negative to the left).
Changed in pygame 2.0.2: The touch attribute was added to all the MOUSE events.
Many new events were introduced in pygame 2.
pygame can recognize text or files dropped in its window. If a file is dropped, DROPFILE event will be sent, file will be its path. The DROPTEXT event is only supported on X11.
pygame 2 also supports controller hot-plugging
Also in this version, instance_id attributes were added to joystick events, and the joy attribute was deprecated.
Since pygame 2.0.1, there are a new set of events, called window events. Here is a list of all window events, along with a short description
If SDL version used is less than 2.0.5, the last two events WINDOWTAKEFOCUS and WINDOWHITTEST will not work.
For each frame of your game, you will need to make some sort of call to the event queue. This ensures your program can internally interact with the rest of the operating system. If you are not using other event functions in your game, you should call pygame.event.pump() to allow pygame to handle internal actions.
This function is not necessary if your program is consistently processing events on the queue through the other pygame.event pygame module for interacting with events and queues functions.
There are important things that must be dealt with internally in the event queue. The main window may need to be repainted or respond to the system. If you fail to make a call to the event queue for too long, the system may decide your program has locked up.
This will get all the messages and remove them from the queue. If a type or sequence of types is given only those messages will be removed from the queue and returned.
If a type or sequence of types is passed in the exclude argument instead, then all only other messages will be removed from the queue. If an exclude parameter is passed, the eventtype parameter must be None.
If you are only taking specific events from the queue, be aware that the queue could eventually fill up with the events you are not interested.
Changed in pygame 1.9.5: Added pump argument
Changed in pygame 2.0.2: Added exclude argument
Returns a single event from the queue. If the event queue is empty an event of type pygame.NOEVENT will be returned immediately. The returned event is removed from the queue.
Returns a single event from the queue. If the queue is empty this function will wait until one is created. From pygame 2.0.0, if a timeout argument is given, the function will return an event of type pygame.NOEVENT if no events enter the queue in timeout milliseconds. The event is removed from the queue once it has been returned. While the program is waiting it will sleep in an idle state. This is important for programs that want to share the system with other applications.
Changed in pygame 2.0.0.dev13: Added timeout argument
Returns True if there are any events of the given type waiting on the queue. If a sequence of event types is passed, this will return True if any of those events are on the queue.
Changed in pygame 1.9.5: Added pump argument
Removes all events from the queue. If eventtype is given, removes the given event or sequence of events. This has the same effect as pygame.event.get() get events from the queue except None is returned. It can be slightly more efficient when clearing a full event queue.
Changed in pygame 1.9.5: Added pump argument
Returns a string representing the name (in CapWords style) of the given event type.
«UserEvent» is returned for all values in the user event id range. «Unknown» is returned when the event type does not exist.
The given event types are not allowed to appear on the event queue. By default all events can be placed on the queue. It is safe to disable an event type multiple times.
If None is passed as the argument, ALL of the event types are blocked from being placed on the queue.
The given event types are allowed to appear on the event queue. By default, all event types can be placed on the queue. It is safe to enable an event type multiple times.
If None is passed as the argument, ALL of the event types are allowed to be placed on the queue.
Returns True if the given event type is blocked from the queue. If a sequence of event types is passed, this will return True if any of those event types are blocked.
It is best to not always grab the input, since it prevents the user from doing other things on their system.
Returns True when the input events are grabbed for this application.
Places the given event at the end of the event queue.
This is usually used for placing custom events on the event queue. Any type of event can be posted, and the events posted can have any attributes.
This returns a boolean on whether the event was posted or not. Blocked events cannot be posted, and this function returns False if you try to post them.
Changed in pygame 2.0.1: returns a boolean, previously returned None
Reserves a pygame.USEREVENT for a custom use.
If too many events are made a pygame.error standard pygame exception is raised.
New in pygame 2.0.0.dev3.
Creates a new event with the given type and attributes. The attributes can come from a dictionary argument with string keys or from keyword arguments.
A pygame object that represents an event. User event instances are created with an pygame.event.Event() create a new event object function call. The EventType type is not directly callable. EventType instances support attribute assignment and deletion.
Read-only. The event type specific attributes of an event. The dict attribute is a synonym for backward compatibility.
Как обрабатывать события от клавиатуры
Любая, даже самая простая игра предполагает взаимодействие с пользователем. Часто для этого используется клавиатура (или тачпад) или мышь. На этом занятии мы с вами увидим как происходит обработка событий от клавиатуры и какие нюансы здесь существуют.
Вообще, за обработку событий отвечает модуль
и ранее мы уже познакомились с методом
То есть, тип – это не только тип события, но и его конкретизация – какое именно событие произошло. Давайте в качестве примера создадим программу, которая при нажатии на курсорные клавиши вправо-влево будет перемещать прямоугольник на экране:
Смотрите, нажимая на курсорные клавиши, происходит изменение координаты x и прямоугольник перерисовывается в новой позиции. Но, если нажать и удерживать клавишу нажатой, то объект сместится только один раз. Постоянного перемещения не происходит, как можно было ожидать. Все дело в том, что при нажатии клавиши в PyGame формируется только одно событие pygame.KEYDOWN. После того, как мы его прочитали из очереди и обработали, повторного такого события там уже нет и, соответственно, условие event.type == pygame.KEYDOWN не срабатывает.
Если мы все же хотим, чтобы при удержании клавиши, прямоугольник постоянно перемещался, то, конечно, это можно реализовать так:
Здесь мы по событию pygame.KEYDOWN изменяем состояния флагов flLeft или flRight в зависимости от нажатия на левую или правую курсорные клавиши. А в основном цикле по этим флагам осуществляем изменение координат прямоугольника. Теперь, он перемещается непрерывно, удерживая клавишу нажатой. При отпускании клавиши генерируется событие pygame.KEYUP и флаги flLeft, flRight устанавливаются в False, движение прекращается.
У вас может возникнуть вопрос: а зачем нам вторая проверка
if event.key in [pygame.K_LEFT, pygame.K_RIGHT]
Это защита от двойных нажатий. Например, удерживая нажатой курсорную клавишу, мы нажимаем, а потом отпускаем еще какую-нибудь. Тогда без этой второй проверки по событию pygame.KEYUP флаги flLeft, flRight станут равными False и движение остановится. Хотя, курсорная клавиша остается нажатой. Чтобы этого не происходило и делается эта дополнительная проверка.
Однако, тот же самый функционал можно реализовать проще, используя модуль работы с клавиатурой
В частности, в нем есть функция:
которая возвращает информацию о состояниях клавиш в виде кортежа:
Если клавиша с определенным индексом нажата, то в этом кортеже ее значение будет 1, а если отжата, то 0. Используя эту функцию, наша программа может быть записана в таком виде:
Как видите, все стало предельно простым. Фактически, функция get_pressed() дает маску нажатых на клавиатуре клавиш и никак не влияет на состояния событий, находящихся в очереди. То есть, мы здесь напрямую не работаем с событиями, зарегистрированные в PyGame, а просто используем информацию о том, какая клавиша нажата. И это имеет свои следствия. Например, если мы хотим перемещать прямоугольник при одновременном нажатии на клавишу Ctrl и курсорные клавиши вправо-влево, то с помощью функции get_pressed() нельзя отследить состояния клавиш-модификаторов:
Shift, Ctrl, Alt и др.
В выходном кортеже информации по ним просто нет. Здесь без обработки событий не обойтись. И лучше всего это сделать вот так:
При этом важна последовательность нажатия на клавиши: сначала нужно нажать левый Ctrl, а потом курсорную клавишу вправо-влево. В другой последовательности работать уже не будет. Библиотека PyGame обрабатывает такие клавиши-модификаторы несколько иначе стандартных клавиш, отсюда и получаются такие особенности.
Вот так в целом выполняется обработка событий от клавиатуры. На следующем занятии мы рассмотрим обработку событий от мыши.
Видео по теме
Что такое Pygame? Каркас приложения, FPS | Pygame #1
Рисование графических примитивов | Pygame #2
Как обрабатывать события от клавиатуры | Pygame #3
Как обрабатывать события от мыши | Pygame #4
Создание поверхностей (Surface) и их анимация. Метод blit | Pygame #5
Класс Rect. Его роль, свойства и методы | Pygame #6
Как рисовать текст различными шрифтами | Pygame #7
Как работать с изображениями. Модули image и transform | Pygame #8
Что такое спрайты и как с ними работать | Pygame #9
Как делать контроль столкновений | Pygame #10
Добавляем звук в игровой процесс. Модули mixer и music | Pygame #11
© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Библиотека pygame №2
Обработка нажатий клавиш клавиатуры
Создадим базовый шаблон для нашей игры (запомните его наизусть)
import pygame
from sys import exit
FPS = 60
clock = pygame.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
События клавиатуры имеют тип KEYDOWN.
import pygame
from sys import exit
FPS = 60
clock = pygame.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
el if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
print ( ‘Левая стрелка’ )
el if event.key == pygame.K_RIGHT:
print ( ‘Правая стрелка’ )
el if event.key == pygame.K_UP:
print ( ‘Стрелка вверх’ )
el if event.key == pygame.K_DOWN:
print ( ‘Стрелка вниз’ )
После запуска скрипта при нажатии стрелок на клавиатуре в стандартный вывод будут выводится строки с информацией о нажатой клавише.
Напишем код, который будет рисовать кружок
import pygame
from sys import exit
FPS = 60
clock = pygame.time. Clock ()
x = 400 # начальная координата по оси X
y = 300 # начальная координата по оси Y
Есть один нюанс. Шарик перемещается только один раз при зажатии одной из клавиш. Немного изменим наш код для того, чтобы он обратывал зажатые клавиш.
События мыши
При нажатии левой кнопки мыши будем рисовать оранжевый кружок
Добавим появление белых кружков по нажатию правой кнопки мыши.
Добавим очищение поверхности при скролле колесика мыши
Задание:
Создайте еще один перемещающийся объект, назначьте клавиши WASD для его перемещения. Ключи клавиш: W == K_w, A == K_a, D == K_d, S == K_s. Обратите внимание, что вам понадобятся новые переменные для координат, например, x1 и y1.
Библиотека Pygame / Часть 1. Введение
Это первая часть серии руководств « Разработка игр с помощью Pygame ». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python.
Что такое Pygame?
Pygame — это «игровая библиотека», набор инструментов, помогающих программистам создавать игры. К ним относятся:
Графика и анимация
Звук (включая музыку)
Управление (мышь, клавиатура, геймпад и так далее)
Игровой цикл
В сердце каждой игры лежит цикл, который принято называть «игровым циклом». Он запускается снова и снова, делая все, чтобы работала игра. Каждый цикл в игре называется кадром.
В каждом кадре происходит масса вещей, но их можно разбить на три категории:
1.Обработка ввода (события)
Речь идет обо всем, что происходит вне игры — тех событиях, на которые она должна реагировать. Это могут быть нажатия клавиш на клавиатуре, клики мышью и так далее.
2.Обновление игры
Изменение всего, что должно измениться в течение одного кадра. Если персонаж в воздухе, гравитация должна потянуть его вниз. Если два объекта встречаются на большой скорости, они должны взорваться.
3.Рендеринг (прорисовка)
В этом шаге все выводится на экран: фоны, персонажи, меню. Все, что игрок должен видеть, появляется на экране в нужном месте.
Время
Еще один важный аспект игрового цикла — скорость его работы. Многие наверняка знакомы с термином FPS, который расшифровывается как Frames Per Second (или кадры в секунду). Он указывает на то, сколько раз цикл должен повториться за одну секунду. Это важно, чтобы игра не была слишком медленной или быстрой. Важно и то, чтобы игра не работала с разной скоростью на разных ПК. Если персонажу необходимо 10 секунд на то, чтобы пересечь экран, эти 10 секунд должны быть неизменными для всех компьютеров.
Создание шаблона Pygame
Теперь, зная из каких элементов состоит игра, можно переходить к процессу написания кода. Начать стоит с создания простейшей программы pygame, которая всего лишь открывает окно и запускает игровой цикл. Это отправная точка для любого проекта pygame.
В начале программы нужно импортировать необходимые библиотеки и задать базовые переменные настроек игры:
Дальше необходимо открыть окно игры:
Теперь необходимо создать игровой цикл:
Раздел рендеринга (отрисовки)
Начнем с раздела отрисовки. Персонажей пока нет, поэтому экран можно заполнить сплошным цветом. Чтобы сделать это, нужно разобраться, как компьютер обрабатывает цвета.
Экраны компьютеров сделаны из пикселей, каждый из которых содержит 3 элемента: красный, зеленый и синий. Цвет пикселя определяется тем, как горит каждый из элементов:
Каждый из трех основных цветов может иметь значение от 0 (выключен) до 255 (включен на 100%), так что для каждого элемента есть 256 вариантов.
Узнать общее количество отображаемых компьютером цветов можно, умножив:
Теперь, зная, как работают цвета, можно задать их в начале программ:
А после этого — заполнить весь экран.
Но этого недостаточно. Дисплей компьютера работает не так. Изменить пиксель — значит передать команду видеокарте, чтобы она передала соответствующую команду экрану. По компьютерным меркам это очень медленный процесс. Если нужно нарисовать на экране много всего, это займет много времени. Исправить это можно оригинальным способом, который называется — двойная буферизация. Звучит необычно, но вот что это такое.
Представьте, что у вас есть двусторонняя доска, которую можно поворачивать, показывая то одну, то вторую сторону. Одна будет дисплеем (то, что видит игрок), а вторая — оставаться скрытой, ее сможет «видеть» только компьютер. С каждым кадром рендеринг будет происходить на задней части доски. Когда отрисовка завершается, доска поворачивается и ее содержимое демонстрируется игроку.
А это значит, что процесс отрисовки происходит один раз за кадр, а не при добавлении каждого элемента.
В pygame это происходит автоматически. Нужно всего лишь сказать доске, чтобы она перевернулась, когда отрисовка завершена. Эта команда называется flip() :
Главное — сделать так, чтобы функция flip() была в конце. Если попытаться отрисовать что-то после поворота, это содержимое не отобразится на экране.
Раздел ввода (событий)
Игры еще нет, поэтому пока сложно сказать, какие кнопки или другие элементы управления понадобятся. Но нужно настроить одно важное событие. Если попытаться запустить программу сейчас, то станет понятно, что нет возможности закрыть окно. Нажать на крестик в верхнем углу недостаточно. Это тоже событие, и необходимо сообщить программе, чтобы она считала его и, соответственно, закрыла игру.
События происходят постоянно. Что, если игрок нажимает кнопку прыжка во время отрисовки? Это нельзя игнорировать, иначе игрок будет разочарован. Для этого pygame сохраняет все события, произошедшие с момента последнего кадра. Даже если игрок будет лупить по кнопкам, вы не пропустите ни одну из них. Создается список, и с помощью цикла for можно пройтись по всем из них.
Контроль FPS
Пока что нечего поместить в раздел Update (обновление), но нужно убедиться, что настройка FPS контролирует скорость игры. Это можно сделать следующим образом:
Команда tick() просит pygame определить, сколько занимает цикл, а затем сделать паузу, чтобы цикл (целый кадр) длился нужно время. Если задать значение FPS 30, это значит, что длина одного кадра — 1/30, то есть 0,03 секунды. Если цикл кода (обновление, рендеринг и прочее) занимает 0,01 секунды, тогда pygame сделает паузу на 0,02 секунды.
Наконец, нужно убедиться, что когда игровой цикл завершается, окно игры закрывается. Для этого нужно поместить функцию pygame.quit() в конце кода. Финальный шаблон pygame будет выглядеть вот так:
В следующем руководстве этот шаблон будет использован как отправная точка для изучения процесса отрисовки объектов на экране и их движения.