как узнать координаты спрайта в pygame
Класс Rect. Его роль, свойства и методы
При разработке игр часто требуется определять границы персонажей, окружающих предметов, определять моменты их столкновений. Во всех этих задачах в PyGame используется специальный объект:
Rect (сокращение от Rectangle – прямоугольник)
Обратите внимание, Rect – это не класс для рисования прямоугольников, это класс для операций с прямоугольными областями и к рисованию он не имеет прямого отношения.
Например, в PyGame каждая поверхность имеет метод:
который возвращает класс Rect с размерами этого слоя. И в качестве начального примера, рассмотрим вот такую простую программу:
Смотрите, у нас здесь определена поверхность hero (герой), которая имеет размеры 40×50 пикселей. Затем, с помощью операции:
мы получаем ссылку на размеры этой области в виде экземпляра класса Rect. Причем, этот класс имеет следующие весьма полезные свойства:
Например, мы можем обратиться к атрибуту center и узнать координаты центра нашего героя:
Мало того, метод get_rect имеет ряд дополнительных, полезных именованных параметров. Например, для определения заданного начального положения координат верхнего левого угла, нужно указать такой параметр:
Или, чтобы определить координаты прямоугольника по центру клиентской области, можно записать следующую команду:
Теперь, мы можем расположить героя точно в центре окна:
Обратите внимание, мы здесь передаем в метод blit объект Rect для позиционирования слоя hero, а не кортеж координат (x, y). Так тоже можно делать и blit автоматически возьмет из Rect координату верхнего левого угла, а остальные параметры проигнорирует.
Это лишь некоторые методы класса Rect. Полный их список можно посмотреть на странице официальной документации:
И обратите внимание на суффикс _ip у одноименных методов. Он указывает, что изменения следует выполнять для текущего экземпляра класса, не создавая нового. Если же этот суффикс отсутствует, то метод создает новый объект класса Rect с соответствующими изменениями его свойств.
Например, давайте создадим в программе два объекта Rect:
И выполним с ними следующие операции:
Результат работы показан на рисунке ниже:
По аналогии работают и другие методы класса Rect.
Давайте для примера, используя класс Rect, напишем программу подпрыгивания нашего героя при нажатии на кнопку пробел (lesson 6.hero_jump.py: https://github.com/selfedu-rus/pygame):
Этот пример показывает как можно использовать класс Rect для реализации простой анимации. Мало того, мы можем указать в методе pygame.display.update() перерисовывать не всю область окна, а только ту часть, где происходит подпрыгивание героя:
Смотрите, теперь кажется, что герой как бы пытается выпрыгнуть из ямы. Я специально показал этот эффект для лучшего понимания работы метода update. Конечно, в нашем случае нужно до главного цикла полностью прорисовать окно:
а уже потом ограничивать область рисования.
Видео по теме
Что такое 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. Работа со спрайтами
Вторая часть серии руководств «Разработка игр с помощью Pygame». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python. Начать стоит с урока: «Библиотека Pygame / Часть 1. Введение».
Что такое спрайт?
Спрайт — это элемент компьютерной графики, представляющий объект на экране, который может двигаться. В двухмерной игре все, что вы видите на экране, является спрайтами. Спрайты можно анимировать, заставлять их взаимодействовать между собой или передавать управление ими игроку.
Для загрузки и отрисовки спрайтов в случай этой игры их нужно добавить в разделы “Обновление” и “Визуализация” игрового цикла. Несложно представить, что если в игре много спрайтов, то цикл довольно быстро станет большим и запутанным. В Pygame для этого есть решение: группировка спрайтов.
Набор спрайтов — это коллекция спрайтов, которые могут отображаться одновременно. Вот как нужно создавать группу спрайтов в игре:
Теперь этой возможностью можно воспользоваться, добавив группу целиком в цикл:
Создание спрайта
Можно переходить к созданию первого спрайта. В Pygame все спрайты выступают объектами. Если вы не работали с этим типом данных в Python, то для начала достаточно знать, что это удобный способ группировки данных и кода в единую сущность. Поначалу это может путать, но спрайты Pygame — отличная возможность попрактиковаться в работе с объектами и понять, как они работают.
Начнем с определения нового спрайта:
Дальше необходимо определить rect спрайта. Это сокращенное от rectangle (прямоугольник). Прямоугольники повсеместно используются в Pygame для отслеживания координат объектов. Команда get_rect() оценивает изображение image и высчитывает прямоугольник, способный окружить его.
rect можно использовать для размещения спрайта в любом месте. Начнем с создания спрайта по центру:
Сейчас, если запустить программу, по центру окна будет находиться зеленый квадрат. Увеличьте значения WIDTH и HEIGHT в настройках программы, чтобы создать достаточно пространства для движения спрайта в следующем шаге.
Движение спрайта
Это значит, что при каждом игровом цикле x-координата спрайта будет увеличиваться на 5 пикселей. Запустите программу, чтобы посмотреть, как он скрывается за пределами экрана, достигая правой стороны.
Исправить это можно, заставив спрайт двигаться по кругу — когда он добирается до правой стороны экрана, просто переносить его влево. Это легко сделать, используя элемент управления rect спрайта:
Так, если левая сторона rect пропадает с экрана, просто задаем значение правого края равное 0:
Теперь можно видеть, как спрайт будто бы двигается по кругу.
Код урока:
В следующем уроке речь пойдет о том, как использовать арт в спрайтах — перейти от обычного квадрата к анимированному персонажу.
Что такое спрайты и как с ними работать
Ссылка на проект занятия (lesson 9.flowballs.zip): https://github.com/selfedu-rus/pygame
Представьте, что мы делаем игру, в которой множество подвижных объектов, с которым взаимодействует пользователь. Как в этом случае правильно спроектировать программу на Pygame, чтобы эффективно обрабатывать движения и взаимодействия? Для этого была специально создана ветка:
для работы со спрайтами. Вообще в игровом процессе спрайт – это любой подвижный объект. И когда таких объектов много, то класс:
значительно облегчает их обработку. И мы сейчас посмотрим, как это делается.
Для начала создадим базовый каркас приложения. Он вам уже знаком и выглядит следующим образом:
Давайте теперь добавим сюда подвижный объект в виде падающего сверху шарика. Для этого мы воспользуемся классом Sprite и на его основе создадим новый класс Ball для обработки падающих шариков. Этот класс мы объявим в отдельном файле ball.py, чтобы сохранить модульность нашей программы:
Затем, эти свойства будут автоматически использоваться для обработки групп спрайтов. Поэтому они необходимы и должны называться именно так.
Отлично, это мы сделали. Теперь в основном модуле подключим этот файл и создадим шар через класс Ball:
После этого в главном цикле реализуем движение шара b1:
И при запуске программы увидим как шар в виде медведя падает вниз. Давайте для красоты добавим еще фон. Сначала загрузим его:
а, затем, в главном цикле будем перерисовывать вместо вызова fill(BLACK):
Получим такой вид игрового процесса:
Далее, смотрите, вот это изменение координат спрайта непосредственно в главном цикле – не лучшая практика. Лучше определить метод update() непосредственно в классе Ball:
А в конструктор добавим параметр speed:
После этого, создаем шарик, указывая три параметра:
и вызываем метод update в главном цикле:
Мы здесь дополнительно передаем высоту окна, чтобы метод update «знал» когда останавливать падение шарика.
Отлично, это мы сделали. Но представим теперь, что у нас одновременно падают несколько шариков. Тогда их нужно сначала создать, например, вот так:
А, затем, в главном цикле перерисовывать:
Группы спрайтов
Текст программы выглядит не очень. Здесь, по сути, происходит дублирование кода, что не есть хорошо. И так как это типовая задача при создании игр, то в Pygame для ее решения было предложено спрайты объединять в группы и обрабатывать их единым образом с позиции этой группы.
Для создания группы используется класс:
и, далее, с помощью метода add мы добавляем в группу наши спрайты:
Обратите внимание, метод add может добавлять как отдельный спрайт, так и несколько спрайтов. Затем, в главном цикле для прорисовки всей группы достаточно вызвать метод:
Здесь sc – это поверхность, на которой рисуется группа спрайтов. И, далее, с помощью метода update() группы выполняется вызов такого же метода у каждого спрайта:
Причем, параметр H будет передан в вызов метода update каждого спрайта. Как видите, благодаря использованию групп, программа стала гораздо понятнее и проще.
Если графически представить работу группы, то это можно изобразить в виде следующей коллекции спрайтов:
И при вызове метода balls.update(H) группы происходит последовательный вызов этого же метода у спрайтов, принадлежащих этой группе.
Давайте еще немного разовьем тему с шариками и сделаем так, чтобы новый появлялся каждые две секунды и падал только до земли, после чего просто исчезал бы. Для этого мы вначале подготовим наборы поверхностей с разными изображениями шаров:
Это позволит только единожды загружать необходимые изображения, а не каждый раз при создании нового шара. И, далее, определим вспомогательную функцию для создания нового шара:
Смотрите, мы здесь в конструктор передаем немного другие параметры: вместо пути к изображению – ссылку на слой с нарисованным шаром, а последний параметр – ссылка на группу, к которой добавляется шар. Причем, добавление реализуем непосредственно в классе Ball. Так как он унаследован от базового класса Sprite, то у Ball есть метод add(), который позволяет добавлять спрайт в указанную группу. И есть методы kill() и remove(), которые удаляют спрайт из группы:
Мы воспользуемся этим функционалом и перепишем класс Ball в следующем виде:
Смотрите, при создании объекта спрайт сначала добавляется к группе, а когда шар долетает до земли, то удаляется из группы. И так как на объект нет других ссылок, то он автоматически уничтожается сборщиком мусора языка Python.
Ну и, наконец, нам нужно каждые две секунды создавать новые шары. Для этого воспользуемся модулем
и определим таймер, который каждые 2000 мс (то есть, 2 сек) будет генерировать событие USEREVENT:
Затем, в главном цикле мы будем отслеживать это пользовательское событие и по нему создавать новый шар:
То есть, вначале перед циклом создаем первый шар, а все последующие создаются каждые две секунды. Причем, они будут автоматически добавляться в группу balls, а при достижении земли – удаляться из нее, что очень удобно.
Вот так осуществляется групповая работа со спрайтами в 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 — шпаргалка для использования
Основные модули пакета Pygame
Модуль | Назначение |
---|---|
pygame.cdrom | Доступ к CD-приводам и управление ими |
pygame.cursors | Загружает изображения курсора |
pygame.display | Доступ к дисплею |
pygame.draw | Рисует фигуры, линии и точки |
pygame.event | Управление внешними событиями |
pygame.font | Использует системные шрифты |
pygame.image | Загружает и сохраняет изображение |
pygame.joystick | Использует джойстики и аналогичные устройства |
pygame.key | Считывает нажатия клавиш с клавиатуры |
pygame.mixer | Загружает и воспроизводит мелодии |
pygame.mouse | Управляет мышью |
pygame.movie | Воспроизведение видеофайлов |
pygame.music | Работает с музыкой и потоковым аудио |
pygame.overlay | Доступ к расширенным видеоизображениям |
pygame | Содержит функции Pygame высокого уровня |
pygame.rect | Управляет прямоугольными областями |
pygame.sndarray | Манипулирует звуковыми данными |
pygame.sprite | Управление движущимися изображениями |
pygame.surface | Управляет изображениями и экраном |
pygame.surfarray | Манипулирует данными пикселей изображения |
pygame.time | модуль pygame для управления временем и частотой кадров |
pygame.transform | Изменение размера и перемещение изображений |
Окно Pygame
Цикл игры, выход из игры
Рисование базовых элементов
модуль pygame.draw
pygame.draw.rect | нарисовать прямоугольную форму |
pygame.draw.polygon | фигуру с любым количеством сторон |
pygame.draw.circle | круг вокруг точки |
pygame.draw.ellipse | нарисовать круглую форму внутри прямоугольника |
pygame.draw.arc | нарисовать секцию эллипса |
pygame.draw.line | нарисовать сегмент прямой линии |
pygame.draw.lines | для рисования нескольких смежных отрезков |
pygame.draw.aaline | рисовать тонкую линию |
pygame.draw.aalines | нарисовать связанную последовательность сглаженных линий |
Загрузка изображения
Объект Rect
pygame.Rect
Pygame использует объекты Rect для хранения и манипулирования прямоугольными областями. Rect может быть создан из комбинации значений слева, сверху, ширины и высоты. Rect также могут быть созданы из объектов python, которые уже являются Rect или имеют атрибут с именем «rect».
Методы работы с Rect
pygame.Rect.copy | Возвращает новый прямоугольник, имеющий ту же позицию и размер, что и оригинал. |
pygame.Rect.move | Возвращает новый прямоугольник, перемещаемый данным смещением. Аргументы x и y могут быть любым целочисленным значением, положительным или отрицательным. |
pygame.Rect.move_ip | То же, что и метод Rect.move (), но работает на месте. |
pygame.Rect.inflate | увеличивать или уменьшать размер прямоугольника, на месте |
pygame.Rect.inflate_ip | увеличивать или уменьшать размер прямоугольника, на месте |
pygame.Rect.clamp | перемещает прямоугольник внутри другого |
pygame.Rect.clamp_ip | перемещает прямоугольник внутри другого, на месте |
pygame.Rect.clip | обрезает прямоугольник внутри другого |
pygame.Rect.union | соединяет два прямоугольника в один |
pygame.Rect.union_ip | соединяет два прямоугольника в один, на месте |
pygame.Rect.unionall | объединение многих прямоугольников |
pygame.Rect.unionall_ip | объединение многих прямоугольников, на месте |
pygame.Rect.fit | изменить размер и переместить прямоугольник учмиывая соотношение сторон |
pygame.Rect.normalize | корректировать отрицательные размеры |
pygame.Rect.contains | проверить, находится ли один прямоугольник внутри другого |
pygame.Rect.collidepoint | проверить, находится ли точка внутри прямоугольника |
pygame.Rect.colliderect | тест, пересекаются ли два прямоугольника |
pygame.Rect.collidelist | проверить, пересекается ли хоть один прямоугольник в списке |
pygame.Rect.collidelistall | пересекаются ли все прямоугольники в списке |
pygame.Rect.collidedict | проверить, если один прямоугольник в словаре пересекается |
pygame.Rect.collidedictall | пересекаются ли все прямоугольники в словаре |
Обработка событий
Событие — это то, как Pygame сообщает о том, что что-то случилось за пределами кода программы. События создаются, например, при нажатии клавиш клавиатуры, мыши и размещаются в очереди, дожидаясь обработки.
Функция get в модуле pygame.event возвращает последнее событие, ожидающее в очереди и удаляет его из очереди.
Объект event
Модуль pygame.event для обработки очереди событий
pygame.event.pump | Если вы не используете другие функции событий в своей игре, вы должны вызвать pygame.event.pump (), чтобы позволить pygame обрабатывать внутренние действия |
pygame.event.get | получает события из очереди |
pygame.event.poll | получить одно событие из очереди |
pygame.event.wait | ждёт одиночного события из очереди |
pygame.event.peek | проверить, ждут ли очереди события определённого типа |
pygame.event.clear | удалить все события из очереди |
pygame.event.event_name | возвращает имя для типа события. Строка находится в стиле WordCap |
pygame.event.set_blocked | проверяет, какие события не разрешены в очереди |
pygame.event.set_allowed | проверяет, какие события разрешены в очереди |
pygame.event.get_blocked | проверить, заблокирован ли тип события из очереди |
pygame.event.set_grab | проверяет совместное использование устройств ввода с другими приложениями |
pygame.event.get_grab | проверить, работает ли программа на устройствах ввода данных |
pygame.event.post | поместить новое событие в очередь |
pygame.event.Event | создать новый объект события |
pygame.event.EventType | Объект Python, представляющий событие SDL. Экземпляры пользовательских событий создаются с вызовом функции Event. Тип EventType не может быть напрямую вызван. Экземпляры EventType поддерживают назначение и удаление атрибутов. |
Pygame отслеживает все сообщения о событиях через очередь событий. Процедуры в этом модуле помогают управлять этой очередью событий. Входная очередь сильно зависит от модуля отображения (display) pygame. Если дисплей не был инициализирован и видеорежим не установлен, очередь событий не будет работать.
Существует множество способов доступа к очереди событий. Просто проверять существование событий, захватывать их непосредственно из стека.
Модуль pygame.mouse для работы с мышью
pygame.mouse.get_pressed | получить состояние кнопок мыши |
pygame.mouse.get_pos | получить позицию курсора мыши |
pygame.mouse.get_rel | получить количество движений мыши |
pygame.mouse.set_pos | установить позицию курсора мыши |
pygame.mouse.set_visible | скрыть или показать курсор мыши |
pygame.mouse.get_focused | проверяет, принимает ли дисплей ввод мыши |
pygame.mouse.set_cursor | установить изображение для курсора мыши |
pygame.mouse.get_cursor | получить изображение для курсора мыши |
Функции мыши можно использовать для получения текущего состояния устройства мышь. Эти функции также могут изменять курсор мыши.
Пример. Нарисовать курсор под текущей позицией мыши.
Определить какая кнопка была нажата на мышке можно используя значение event.button:
Пример. Перемещать картинку курсором мыши.
Клавиатура
Модуль pygame.key
Этот модуль содержит функции для работы с клавиатурой.Очередь событий получает события pygame.KEYDOWN и pygame.KEYUP при нажатии и отпускании клавиш клавиатуры.
Оба события имеют ключевой атрибут, который представляет собой целочисленный идентификатор, представляющий каждую клавишу на клавиатуре.Событие pygame.KEYDOWN имеет дополнительные атрибуты: unicode и scancode. unicode представляет собой одну символьную строку, которая соответствует введённому символу. Scancode представляет собой код для конкретной платформы.
Получить код клавиши:
Существует много клавиатурных констант, они используются для представления клавиш на клавиатуре. Ниже приведен список всех клавиатурных констант:
KeyASCII | ASCII | CommonName |
---|---|---|
K_BACKSPACE | \b | backspace |
K_TAB | \t | tab |
K_CLEAR | clear | |
K_RETURN | \r | return |
K_PAUSE | pause | |
K_ESCAPE | ^[ | escape |
K_SPACE | space | |
K_EXCLAIM | ! | exclaim |
K_QUOTEDBL | « | quotedbl |
K_HASH | # | hash |
K_DOLLAR | $ | dollar |
K_AMPERSAND | & | ampersand |
K_QUOTE | quote | |
K_LEFTPAREN | ( | leftparenthesis |
K_RIGHTPAREN | ) | rightparenthesis |
K_ASTERISK | * | asterisk |
K_PLUS | + | plussign |
K_COMMA | , | comma |
K_MINUS | — | minussign |
K_PERIOD | . | period |
K_SLASH | / | forwardslash |
K_0 | 0 | 0 |
K_1 | 1 | 1 |
K_2 | 2 | 2 |
K_3 | 3 | 3 |
K_4 | 4 | 4 |
K_5 | 5 | 5 |
K_6 | 6 | 6 |
K_7 | 7 | 7 |
K_8 | 8 | 8 |
K_9 | 9 | 9 |
K_COLON | : | colon |
K_SEMICOLON | ; | semicolon |
K_LESS | less-thansign | |
K_EQUALS | = | equalssign |
K_GREATER | > | greater-thansign |
K_QUESTION | ? | questionmark |
K_AT | @ | at |
K_LEFTBRACKET | [ | leftbracket |
K_BACKSLASH | \ | backslash |
K_RIGHTBRACKET | ] | rightbracket |
K_CARET | ^ | caret |
K_UNDERSCORE | _ | underscore |
K_BACKQUOTE | ` | grave |
K_a | a | a |
K_b | b | b |
K_c | c | c |
K_d | d | d |
K_e | e | e |
K_f | f | f |
K_g | g | g |
K_h | h | h |
K_i | i | i |
K_j | j | j |
K_k | k | k |
K_l | l | l |
K_m | m | m |
K_n | n | n |
K_o | o | o |
K_p | p | p |
K_q | q | q |
K_r | r | r |
K_s | s | s |
K_t | t | t |
K_u | u | u |
K_v | v | v |
K_w | w | w |
K_x | x | x |
K_y | y | y |
K_z | z | z |
K_DELETE | delete | |
K_KP0 | keypad0 | |
K_KP1 | keypad1 | |
K_KP2 | keypad2 | |
K_KP3 | keypad3 | |
K_KP4 | keypad4 | |
K_KP5 | keypad5 | |
K_KP6 | keypad6 | |
K_KP7 | keypad7 | |
K_KP8 | keypad8 | |
K_KP9 | keypad9 | |
K_KP_PERIOD | . | keypadperiod |
K_KP_DIVIDE | / | keypaddivide |
K_KP_MULTIPLY | * | keypadmultiply |
K_KP_MINUS | — | keypadminus |
K_KP_PLUS | + | keypadplus |
K_KP_ENTER | \r | keypadenter |
K_KP_EQUALS | = | keypadequals |
K_UP | uparrow | |
K_DOWN | downarrow | |
K_RIGHT | rightarrow | |
K_LEFT | leftarrow | |
K_INSERT | insert | |
K_HOME | home | |
K_END | end | |
K_PAGEUP | pageup | |
K_PAGEDOWN | pagedown | |
K_F1 | F1 | |
K_F2 | F2 | |
K_F3 | F3 | |
K_F4 | F4 | |
K_F5 | F5 | |
K_F6 | F6 | |
K_F7 | F7 | |
K_F8 | F8 | |
K_F9 | F9 | |
K_F10 | F10 | |
K_F11 | F11 | |
K_F12 | F12 | |
K_F13 | F13 | |
K_F14 | F14 | |
K_F15 | F15 | |
K_NUMLOCK | numlock | |
K_CAPSLOCK | capslock | |
K_SCROLLOCK | scrollock | |
K_RSHIFT | rightshift | |
K_LSHIFT | leftshift | |
K_RCTRL | rightcontrol | |
K_LCTRL | leftcontrol | |
K_RALT | rightalt | |
K_LALT | leftalt | |
K_RMETA | rightmeta | |
K_LMETA | leftmeta | |
K_LSUPER | leftWindowskey | |
K_RSUPER | rightWindowskey | |
K_MODE | modeshift | |
K_HELP | help | |
K_PRINT | printscreen | |
K_SYSREQ | sysrq | |
K_BREAK | break | |
K_MENU | menu | |
K_POWER | power | |
K_EURO | Euro |
Направленное движение с помощью клавиш
Можно перемещать изображение на экране с клавиатуры, назначая клавиши для перемещений: вверх, вниз, влево, вправо.
Создать картинку, например:
Проверить очередь событий:
Проверить, является ли полученное событие нажатием на клавиши со стрелками:
Если — да, то получмить код нажатой клавиши и сформировать новые координаты для картинки:
И нарисовать картинку в новом месте:
Объект Surface
pygame.Surface — объект pygame для представления изображений
Наложение поверхностей, прозрачность.
Управление временем
Модуль pygame.time содержит объект Clock, который можно использовать для отслеживания
времени. Чтобы создать объект типа: время, вызывается конструктор pygame.time.Clock:
clock = pygame.time.Clock()
Когда создан объект clock, можно вызвать его функцию tick один раз за кадр,
которая возвращает время, прошедшее со времени предыдущего вызова в миллисекундах:
time_passed = clock.tick ()
Функция tick может использовать необязательный параметр для установления максимальной частоты кадров. Этот параметр нужен, если игра запущена на рабочем компьютере и необходимо контролировать, чтобы она не использовала всю его вычислительная мощность на 100%:
# Игра будет работать со скоростью не более 30 кадров в секунду
time_passed = clock.tick (30)
Звуки
Загружаем звуковой файл в формате *.wav
sound = pygame.mixer.Sound(«sound.wav»)
(загружаем до игрового цикла, т.к. это очень долгая операция)
Столкновения (collisions)
При написании игр часто возникает необходимость проверять взаимное расположение объектов на экране, отслеживать моменты их столкновений, пересечений.
Эта задача может быть реализована разными способами.
Например, используя объект Rect
Или используя поверхности — surface