Что такое спрайт в pygame

Классы Sprite и Group

В программировании игр спрайтом называют объект, который предстает перед пользователем в виде анимированного изображения и в большинстве случаев предполагает взаимодействие с ним. Другими словами, все что в игре не является фоном, а интерактивным объектом-картинкой – это спрайт.

Хотя каждый спрайт может быть уникальным, у всех есть нечто общее, что в pygame вынесено в отдельный класс Sprite, находящийся в модуле pygame.sprite.

На базе этого класса следует создавать собственные классы спрайтов и уже от них объекты. Таким образом, класс pygame.sprite.Sprite играет роль своего рода абстрактного класса. Хотя таковым не является, можно создавать объекты непосредственно от Sprite.

В модуле pygame.sprite кроме класса Sprite есть класс Group и родственные ему, которые предназначены для объединения спрайтов в группы. Это позволяет вызывать один метод группы, который, например, обновит состояние всех спрайтов, входящих в эту группу.

Почти все предопределенные методы класса pygame.sprite.Sprite касаются добавления экземпляра в группу, удаления из нее, проверки вхождения. Только метод update() затрагивает поведение самого спрайта, этот метод следует переопределить в производном от Sprite классе.

Рассмотрим, как это работает. В примерах кода ниже сначала одна, а потом и множество машинок перемещаются сверху вниз. Каждая такая машинка – объект-спрайт, созданный от класса Car, который является дочерним от Sprite.

В конструкторе производного от Sprite класса необходимо вызвать конструктор родительского класса, а также обзавестись экземплярами Surface и Rect, имена которых должны быть соответственно self.image и self.rect. Так надо, чтобы с экземплярами класса могли работать методы группы. В остальном вы можете добавлять любые атрибуты.

Как создается поверхность (а также прямоугольная область), неважно. В примере ниже это делается с помощью функции load(). Однако в конструктор может передаваться уже подготовленный экземпляр Surface.

В данном случае мы изменяем свойства экземпляра за пределами класса. Правильней будет делать это в методе update():

Теперь представим, что у нас не одна машинка, а три:

Если будет 100 машинок, придется 100 раз вызвать blit() и update(). Класс Group решает эту проблему. Добавлять спрайты в группу можно методом add() группы (по одной или все вместе).

У групп есть методы update() и draw(). Метод update() группы вызывает методы update() всех входящих в нее объектов. А метод draw() выполняет метод blit(). При этом в draw() надо передать поверхность, на которой будет происходить отрисовка:

Допустим, мы хотим, чтобы новые машинки появлялись постоянно и в разные моменты времени, двигались с разной скоростью, а выезд объекта за пределы экрана обозначал бы, что он исчезает.

Потребуется таймер, который устанавливается вызовом функции pygame.time.set_timer(). В примере ниже через каждые 3 секунды будет генерироваться событие, значение поля type которого совпадает с константой pygame.USEREVENT. И как только это событие будет происходить, будет создаваться новый объект.

Метод kill() спрайта удаляет его из всех групп, в которых он содержится. Есть метод remove(), который удаляет только из указанных в качестве аргумента групп. У спрайтов также как у групп есть метод add(). Только в данном случае ему передается не объект, а группа.

Практическая работа

В модуле pygame.sprite есть ряд функций для проверки коллизий спрайтов. Одна из них spritecollideany() проверяет, столкнулся ли конкретный спрайт с любым из спрайтов из группы. Функция принимает первым аргументом спрайт, чья коллизия проверяется, вторым – группу.

Измените программу выше так, чтобы машинки появлялись чаще. Добавьте спрайт, который «едет» навстречу всем другим и управляется стрелками влево и вправо на клавиатуре. Цель игры – не допустить столкновения. Если оно происходит, то программа завершается.

Шапошникова С. (plustilino) © 2020

Pygame. Введение в разработку игр на Python

Источник

Библиотека Pygame / Часть 2. Работа со спрайтами

Библиотека Pygame / Часть 2. Работа со спрайтами

Вторая часть серии руководств « Разработка игр с помощью Pygame ». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python. Начать стоит с урока: « Библиотека Pygame / Часть 1. Введение ».

Что такое спрайт?

Спрайт — это элемент компьютерной графики, представляющий объект на экране, который может двигаться. В двухмерной игре все, что вы видите на экране, является спрайтами. Спрайты можно анимировать, заставлять их взаимодействовать между собой или передавать управление ими игроку.

Для загрузки и отрисовки спрайтов в случай этой игры их нужно добавить в разделы “Обновление” и “Визуализация” игрового цикла. Несложно представить, что если в игре много спрайтов, то цикл довольно быстро станет большим и запутанным. В Pygame для этого есть решение: группировка спрайтов.

Набор спрайтов — это коллекция спрайтов, которые могут отображаться одновременно. Вот как нужно создавать группу спрайтов в игре:

Теперь этой возможностью можно воспользоваться, добавив группу целиком в цикл:

Создание спрайта

Можно переходить к созданию первого спрайта. В Pygame все спрайты выступают объектами. Если вы не работали с этим типом данных в Python, то для начала достаточно знать, что это удобный способ группировки данных и кода в единую сущность. Поначалу это может путать, но спрайты Pygame — отличная возможность попрактиковаться в работе с объектами и понять, как они работают.

Начнем с определения нового спрайта:

Дальше необходимо определить rect спрайта. Это сокращенное от rectangle (прямоугольник). Прямоугольники повсеместно используются в Pygame для отслеживания координат объектов. Команда get_rect() оценивает изображение image и высчитывает прямоугольник, способный окружить его.

rect можно использовать для размещения спрайта в любом месте. Начнем с создания спрайта по центру:

Сейчас, если запустить программу, по центру окна будет находиться зеленый квадрат. Увеличьте значения WIDTH и HEIGHT в настройках программы, чтобы создать достаточно пространства для движения спрайта в следующем шаге.

Движение спрайта

Это значит, что при каждом игровом цикле x-координата спрайта будет увеличиваться на 5 пикселей. Запустите программу, чтобы посмотреть, как он скрывается за пределами экрана, достигая правой стороны.

Исправить это можно, заставив спрайт двигаться по кругу — когда он добирается до правой стороны экрана, просто переносить его влево. Это легко сделать, используя элемент управления rect спрайта:Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Так, если левая сторона rect пропадает с экрана, просто задаем значение правого края равное 0:

Теперь можно видеть, как спрайт будто бы двигается по кругу.

Источник

Библиотека Pygame / Часть 2. Работа со спрайтами

Вторая часть серии руководств «Разработка игр с помощью Pygame». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python. Начать стоит с урока: «Библиотека Pygame / Часть 1. Введение».

Что такое спрайт?

Спрайт — это элемент компьютерной графики, представляющий объект на экране, который может двигаться. В двухмерной игре все, что вы видите на экране, является спрайтами. Спрайты можно анимировать, заставлять их взаимодействовать между собой или передавать управление ими игроку.

Для загрузки и отрисовки спрайтов в случай этой игры их нужно добавить в разделы “Обновление” и “Визуализация” игрового цикла. Несложно представить, что если в игре много спрайтов, то цикл довольно быстро станет большим и запутанным. В Pygame для этого есть решение: группировка спрайтов.

Набор спрайтов — это коллекция спрайтов, которые могут отображаться одновременно. Вот как нужно создавать группу спрайтов в игре:

Теперь этой возможностью можно воспользоваться, добавив группу целиком в цикл:

Создание спрайта

Можно переходить к созданию первого спрайта. В Pygame все спрайты выступают объектами. Если вы не работали с этим типом данных в Python, то для начала достаточно знать, что это удобный способ группировки данных и кода в единую сущность. Поначалу это может путать, но спрайты Pygame — отличная возможность попрактиковаться в работе с объектами и понять, как они работают.

Начнем с определения нового спрайта:

Дальше необходимо определить rect спрайта. Это сокращенное от rectangle (прямоугольник). Прямоугольники повсеместно используются в Pygame для отслеживания координат объектов. Команда get_rect() оценивает изображение image и высчитывает прямоугольник, способный окружить его.

rect можно использовать для размещения спрайта в любом месте. Начнем с создания спрайта по центру:

Сейчас, если запустить программу, по центру окна будет находиться зеленый квадрат. Увеличьте значения WIDTH и HEIGHT в настройках программы, чтобы создать достаточно пространства для движения спрайта в следующем шаге.

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Движение спрайта

Это значит, что при каждом игровом цикле x-координата спрайта будет увеличиваться на 5 пикселей. Запустите программу, чтобы посмотреть, как он скрывается за пределами экрана, достигая правой стороны.

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Исправить это можно, заставив спрайт двигаться по кругу — когда он добирается до правой стороны экрана, просто переносить его влево. Это легко сделать, используя элемент управления rect спрайта:

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Так, если левая сторона rect пропадает с экрана, просто задаем значение правого края равное 0:

Теперь можно видеть, как спрайт будто бы двигается по кругу.

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Код урока:

В следующем уроке речь пойдет о том, как использовать арт в спрайтах — перейти от обычного квадрата к анимированному персонажу.

Источник

Что такое спрайты и как с ними работать

Ссылка на проект занятия (lesson 9.flowballs.zip): https://github.com/selfedu-rus/pygame

Представьте, что мы делаем игру, в которой множество подвижных объектов, с которым взаимодействует пользователь. Как в этом случае правильно спроектировать программу на Pygame, чтобы эффективно обрабатывать движения и взаимодействия? Для этого была специально создана ветка:

для работы со спрайтами. Вообще в игровом процессе спрайт – это любой подвижный объект. И когда таких объектов много, то класс:

значительно облегчает их обработку. И мы сейчас посмотрим, как это делается.

Для начала создадим базовый каркас приложения. Он вам уже знаком и выглядит следующим образом:

Давайте теперь добавим сюда подвижный объект в виде падающего сверху шарика. Для этого мы воспользуемся классом Sprite и на его основе создадим новый класс Ball для обработки падающих шариков. Этот класс мы объявим в отдельном файле ball.py, чтобы сохранить модульность нашей программы:

Затем, эти свойства будут автоматически использоваться для обработки групп спрайтов. Поэтому они необходимы и должны называться именно так.

Отлично, это мы сделали. Теперь в основном модуле подключим этот файл и создадим шар через класс Ball:

После этого в главном цикле реализуем движение шара b1:

И при запуске программы увидим как шар в виде медведя падает вниз. Давайте для красоты добавим еще фон. Сначала загрузим его:

а, затем, в главном цикле будем перерисовывать вместо вызова fill(BLACK):

Получим такой вид игрового процесса:

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Далее, смотрите, вот это изменение координат спрайта непосредственно в главном цикле – не лучшая практика. Лучше определить метод update() непосредственно в классе Ball:

А в конструктор добавим параметр speed:

После этого, создаем шарик, указывая три параметра:

и вызываем метод update в главном цикле:

Мы здесь дополнительно передаем высоту окна, чтобы метод update «знал» когда останавливать падение шарика.

Отлично, это мы сделали. Но представим теперь, что у нас одновременно падают несколько шариков. Тогда их нужно сначала создать, например, вот так:

А, затем, в главном цикле перерисовывать:

Группы спрайтов

Текст программы выглядит не очень. Здесь, по сути, происходит дублирование кода, что не есть хорошо. И так как это типовая задача при создании игр, то в Pygame для ее решения было предложено спрайты объединять в группы и обрабатывать их единым образом с позиции этой группы.

Для создания группы используется класс:

и, далее, с помощью метода add мы добавляем в группу наши спрайты:

Обратите внимание, метод add может добавлять как отдельный спрайт, так и несколько спрайтов. Затем, в главном цикле для прорисовки всей группы достаточно вызвать метод:

Здесь sc – это поверхность, на которой рисуется группа спрайтов. И, далее, с помощью метода update() группы выполняется вызов такого же метода у каждого спрайта:

Причем, параметр H будет передан в вызов метода update каждого спрайта. Как видите, благодаря использованию групп, программа стала гораздо понятнее и проще.

Если графически представить работу группы, то это можно изобразить в виде следующей коллекции спрайтов:

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

И при вызове метода balls.update(H) группы происходит последовательный вызов этого же метода у спрайтов, принадлежащих этой группе.

Давайте еще немного разовьем тему с шариками и сделаем так, чтобы новый появлялся каждые две секунды и падал только до земли, после чего просто исчезал бы. Для этого мы вначале подготовим наборы поверхностей с разными изображениями шаров:

Это позволит только единожды загружать необходимые изображения, а не каждый раз при создании нового шара. И, далее, определим вспомогательную функцию для создания нового шара:

Смотрите, мы здесь в конструктор передаем немного другие параметры: вместо пути к изображению – ссылку на слой с нарисованным шаром, а последний параметр – ссылка на группу, к которой добавляется шар. Причем, добавление реализуем непосредственно в классе Ball. Так как он унаследован от базового класса Sprite, то у Ball есть метод add(), который позволяет добавлять спрайт в указанную группу. И есть методы kill() и remove(), которые удаляют спрайт из группы:

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Мы воспользуемся этим функционалом и перепишем класс Ball в следующем виде:

Смотрите, при создании объекта спрайт сначала добавляется к группе, а когда шар долетает до земли, то удаляется из группы. И так как на объект нет других ссылок, то он автоматически уничтожается сборщиком мусора языка Python.

Ну и, наконец, нам нужно каждые две секунды создавать новые шары. Для этого воспользуемся модулем

и определим таймер, который каждые 2000 мс (то есть, 2 сек) будет генерировать событие USEREVENT:

Затем, в главном цикле мы будем отслеживать это пользовательское событие и по нему создавать новый шар:

То есть, вначале перед циклом создаем первый шар, а все последующие создаются каждые две секунды. Причем, они будут автоматически добавляться в группу balls, а при достижении земли – удаляться из нее, что очень удобно.

Вот так осуществляется групповая работа со спрайтами в Pygame.

Видео по теме

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Что такое Pygame? Каркас приложения, FPS | Pygame #1

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Рисование графических примитивов | Pygame #2

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Как обрабатывать события от клавиатуры | Pygame #3

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Как обрабатывать события от мыши | Pygame #4

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Создание поверхностей (Surface) и их анимация. Метод blit | Pygame #5

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Класс Rect. Его роль, свойства и методы | Pygame #6

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Как рисовать текст различными шрифтами | Pygame #7

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Как работать с изображениями. Модули image и transform | Pygame #8

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Что такое спрайты и как с ними работать | Pygame #9

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Как делать контроль столкновений | Pygame #10

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Добавляем звук в игровой процесс. Модули mixer и music | Pygame #11

© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Источник

Библиотека Pygame / Часть 3. Больше о спрайтах

Третья часть серии руководств «Разработка игр с помощью Pygame». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python. Начать стоит с урока: «Библиотека Pygame / Часть 1. Введение».

Графические спрайты

Разноцветные прямоугольники вполне можно использовать на старте разработки, чтобы убедиться, что игра работает, но рано или поздно захочется задействовать изображение космического корабля или персонажа для спрайта. Это подводит к первому вопросу: где брать графику для игры?

Где искать арт

Когда вам нужен арт для игры, у вас есть 3 варианта:

Первый и второй варианты подходят для творческих людей или тех, у кого есть талантливые друзья, но у большинства программистов рисование не входит в набор навыков. Поэтому остается интернет. Но здесь важно помнить, что нельзя использовать изображения, на которые у вас нет прав. Вы без проблем найдете изображение с Марио или любимым Покемоном, но их нельзя использовать, особенно если планируется выкладывать игру в интернет для других пользователей.

К счастью, есть хорошее решение — OpenGameArt.org. На этом сайте полно изображений, звуков, музыки и другого контента. Весь он лицензирован так, что его можно свободно использовать в играх. Один из лучших создателей контента на этом сайте — Kenney. Его можно найти, просто введя это имя в строку поиска или зайти на его сайт.

Особенность арта Kenney (помимо отличного качества) — он выпускает контент в коллекциях. Это значит, что разработчик получает различные изображения, выполненные в едином стиле, и нет необходимости брать картинки в разных источниках.

В этом уроке будет использоваться набор Platformer Art Complete Pack от Kenney, в котором полно графики для создания игры в жанре платформера. Нужно всего лишь скачать его и распаковать. Начнем с изображения p1_jump.png.

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Или же можете просто скачать картинку отсюда.

Организация игровых ассетов

В первую очередь нужна папка для хранения ассетов. В играх так называют, например, арты или звук. Назовем папку “img” и перенесем туда изображение игрока.

Чтобы использовать изображение в игре, нужно сообщить библиотеке Pygame, чтобы она загружала файл. Для этого необходимо указать его местоположение. В зависимости от используемого компьютера этот процесс может отличаться, но поскольку нужно сделать так, чтобы игра работала на любом устройстве, необходимо загрузить библиотеку Python под название os и указать, где находится игра:

Специальная переменная __file__ относится к папке, в которой сохранен код игры, а команда os.path.dirname указывает путь к папке. Например, путь к коду на компьютере с macOS может быть такой:

Если используется Windows, тогда он будет выглядеть приблизительно вот так:

Разные операционные системы по-разному подходят к поиску местоположения файлов. С помощью команды os.path можно позволить ПК самостоятельно определять правильный путь (вне зависимости от того, используется “/” или “”).

Теперь можно точно указать местоположение папки “img”:

Если сейчас запустить программу, вы увидите маленького инопланетянина, который двигается по экрану. Но осталась одна проблема, которой не видно из-за черного фона. С помощью команды screen.fill() нужно поменять цвет фона, например, на синий. Теперь понятно, в чем проблема.

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Файл изображения на компьютере — это всегда сетка пикселей. Вне зависимости от нарисованной формы, имеются дополнительные пиксели, заполняющие «фон». Нужно сообщить Pygame, чтобы она игнорировала пиксели, которые не нужны. В случае этого изображения речь идет о черном цвете, поэтому в код необходимо добавить следующее:

set_colorkey() говорит Pygame игнорировать любые пиксели конкретного цвета. Так выглядит намного лучше:

Что такое спрайт в pygame. Смотреть фото Что такое спрайт в pygame. Смотреть картинку Что такое спрайт в pygame. Картинка про Что такое спрайт в pygame. Фото Что такое спрайт в pygame

Вы освоили основы работы с Python! Время переходить к созданию настоящей игры. У нас есть руководство с процессом создания игры Shoot ’em up от начала и до конца.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *