Стрелялка с Pygame №7: счет и рендеринг текста
Седьмая часть проекта «Стрелялка с Pygame». Если пропустили, обязательно вернитесь и начните с первой части. В этот раз начнем вести счет и научимся выводить текст на экран.
В этой серии уроков будет создана полноценная игра на языке Python с помощью библиотеки Pygame. Она будет особенно интересна начинающим программистам, которые уже знакомы с основами языка и хотят углубить знания, а также узнать, что лежит в основе создания игр.
Ведение счета
Ведение счет игрока — простая задача. Нужно переменная с начальным значением 0, к которой будет добавляться +1 при каждом уничтожении астероида. Поскольку астероиды разные, а в крупные попасть легче, чем в маленькие, есть смысл в том, чтобы давать больше очков за уничтожение тех, что поменьше.
Назовем переменную score и объявим ее до игрового цикла:
Чтобы назначать очки в зависимости от размера астероида, можно использовать свойство radius . У самых крупных астероидов изображение больше 100 пикселей, а радиус 100 * 0.85 / 2 = 43 пикселя. В то же время радиус самого маленького астероида — всего 8 пикселей. Можно вычитать радиус из большего числа, например 50, чтобы получать количество очков. Так, большой будет давать всего 7 очков, а маленький — 42 очка.
Рендеринг текста
Теперь, когда есть переменная со счетом, нужно отрисовывать ее на экране, и вот это уже посложнее. Делается все в несколько этапов. Если вы планируете выводить текст не один раз, тогда есть смысла создать функцию, которая будет называться draw_text . Ее параметры:
- surf — поверхность, на которой текст будет написан
- text — строка, которую нужно отображать
- x, y — положение
Также нужно выбрать шрифт. Проблема может возникнуть, если выбрать тот шрифт, который не установлен на компьютере. Решить это можно с помощью pygame.font.match_font() , которая ищет наиболее подходящий шрифт в системе.
Вот вся функция draw_text :
Отрисовка текста на экране — это, фактически, вычисление необходимой структуры пикселей. В компьютерной графике это называется «рендерингом». За это будет отвечать функция font.render() . В функции есть неизвестный параметр True , который отвечает за включение и отключение сглаживания.
Сглаживание
Если вы когда-нибудь пытались нарисовать что-нибудь пикселями (или, например, блоками в Minecraft), то знаете, насколько сложно изображать изогнутые линии на квадратной сетке. Максимум, что выходит, — зубчатая форма. Такая зубчатость называется «алиасингом». Вот как она выглядит:
Первая «a» выглядит чересчур угловатой из-за алиасинга. Сглаживание (анти-алиасинг) — это то, как современные компьютеры работают с текстом, чтобы он не был настолько зубчатым. Это происходит с помощью смешивания пикселей с фоном на границах объектов. В уменьшенном масштабе такой шрифт выглядит чисто и аккуратно.
Отображение счета
Теперь можно показывать счет на экране. Нужно лишь добавить его в раздел отрисовки в верхней части экрана по центру.
Создание игр на Python 3 и Pygame: Часть 2
Во второй из пяти частей туториала, посвящённого созданию игр с помощью Python 3 и Pygame, мы рассмотрим класс TextObject , используемый для рендеринга текста на экране. Мы создадим основное окно, в том числе и фоновое изображение, а затем научимся отрисовывать объекты: кирпичи, мяч и ракетку.
Класс TextObject
Класс TextObject предназначен для отображения текста на экране. Можно сделать вывод, что с точки зрения дизайна он должен быть подклассом класса GameObject , потому что тоже является визуальным объектом и его тоже иногда нужно двигать. Но я не хотел вводить глубокую иерархию классов, при которой весь отображаемый Breakout текст оставался на экране неизменным.
Класс TextObject создаёт объект шрифта. Он рендерит текст на отдельную текстовую поверхность, которая затем копируется (рендерится) на основную поверхность. Интересный аспект TextObject заключается в том, что у него нет какого-то фиксированного текста. Он получает функцию text_func() , вызываемую каждый раз, когда он рендерится.
Это позволяет нам обновлять отображение жизней и очков в Breakout, просто создав функцию, возвращающую текущие жизни и очки, а не отслеживать то, какие текстовые объекты отображают очки и жизни и обновлять их текст при каждом их изменении. Это удобный трюк из функционального программирования, и в крупных играх он позволяет поддерживать удобство и аккуратность программы.
Создание основного окна
Игры на Pygame выполняются в окнах. Можно даже сделать так, чтобы они выполнялись в полноэкранном режиме. Сейчас я расскажу, как отобразить пустое окно Pygame. Вы увидите многие элементы, которые мы обсуждали ранее. Сначала вызывается init() Pygame, а затем создаются основная поверхность рисования и таймер.
Затем выполняется основной цикл, который постоянно заполняет экран однотонным серым цветом и вызывает метод таймера tick() с частотой кадров.
Использование фонового изображения
Обычно однотонный цвет фона выглядит не очень интересно. Pygame очень хорошо работает с изображениями. Для Breakout я нашёл любопытную фотографию настоящего космоса, сделанную НАСА. Код очень прост. Сначала он перед основным циклом загружает фоновое изображение с помощью функции pygame.image.load() . Затем вместо того, чтобы заливать экран цветом, он выполняет блиттинг (копирование битов) изображения на экран в позицию (0,0). В результате на экране отображается изображение.

Отрисовка фигур
Pygame может рисовать всё, что угодно. В модуле pygame.draw есть функции для отрисовки следующих фигур:
- прямоугольника (rect)
- многоугольника (polygon)
- круга (circle)
- эллипса (ellipse)
- дуги (arc)
- отрезка (line)
- отрезков (lines)
- сглаженного отрезка (anti-aliased line)
- сглаженных отрезков (anti-aliased lines)
Отрисовка кирпичей
Кирпичи — это просто прямоугольники. В Pygame есть функция pygame.draw.rect() , получающая поверхность, цвет и объект Rect (левую и верхнюю координату, ширину и высоту) и рендерящая прямоугольник. Если дополнительный параметр ширины больше нуля, то он отрисовывает контур. Если ширина равна нулю (значение по умолчанию), то рисует сплошной прямоугольник.
Стоит заметить, что класс Brick является подклассом GameObject и получает все его свойства, но также имеет и цвет, который обрабатывает самостоятельно (потому что могут существовать игровые объекты, имеющие несколько цветов). Поле special_effect мы пока рассматривать не будем.
Отрисовка мяча
Мяч в Breakout — это просто круг. В Pygame есть функция pygame.draw.circle() , получающая цвет, центр, радиус и дополнительный параметр ширины, который по умолчанию равен нулю. Как и в функции pygame.draw.rect() , если ширина равна нулю, то отрисовывается сплошной круг. Ball тоже является подклассом GameObject.
Так как мяч всегда движется (в отличие от кирпичей), он также имеет скорость, которая передаётся для обработки базовому классу GameObject . Класс Ball имеет небольшое отличие — параметры x и y обозначают его центр, а параметры x и y, передаваемые базовому классу GameObject являются верхним левым углом ограничивающего прямоугольника. Чтобы преобразовать центр в верхний левый угол, достаточно вычесть радиус.
Отрисовка ракетки
Ракетка — это ещё один прямоугольник, двигающийся влево и вправо в ответ на нажатия игроком клавиш со стрелками. Это значит, что положение ракетки в разных кадрах может отличаться, но в процессе отрисовки это просто прямоугольник, который должен рендериться в текущей позиции, какой бы она ни была. Вот как выглядит соответствующий код:
Заключение
В этой части мы узнали о классе TextObject и о том, как рендерить текст на экране. Также мы познакомились с тем, как рисовать объекты: кирпичи, мяч и ракетку.
В третьей части мы узнаем, как работает обработка событий и как Pygame позволяет нам перехватывать события и реагировать на них (нажатия клавиш, движение мыши и нажатия кнопок мыши). Также мы рассмотрим такие элементы игрового процесса, как движение мяча, задание его скорости и перемещение ракетки.
Python | Отображать текст в окне PyGame
Pygame — это кроссплатформенный набор модулей Python, предназначенных для написания видеоигр. Он включает в себя компьютерную графику и звуковые библиотеки, разработанные для использования с языком программирования Python. Теперь дело за фантазией или необходимостью разработчика, какую игру он хочет разработать с помощью этого инструментария.
Команда для установки Pygame в системе на базе Windows:
Существует 7 основных шагов для отображения текста в окне pygame :
- Создайте объект отображаемой поверхности, используя метод pygame display.set_mode() .
- Создайте объект Font, используя fony.Font() .
- Создайте объект поверхности поверхности iesurface, в котором на нем будет нарисован текст, используя метод render() объекта шрифта pygame.
- Создайте прямоугольный объект для объекта текстовой поверхности, используя get_rect() объекта текстовой поверхности get_rect() .
- Задайте положение объекта «Прямоугольник», установив значение свойства center прямоугольного объекта Pygame.
- Копирование объекта Поверхность текста в объект отображаемой поверхности с помощью метода blit() объекта отображаемой поверхности Pygame.
- Отобразите объект отображаемой поверхности в окне pygame, используя метод pygame display.update() .
Ниже приведена реализация:
# импорт модуля pygame в эту программу
# активировать библиотеку pygame
# инициировать Pygame и дать разрешение
# использовать функциональность Pygame.
pygame.init()
# определить значение RGB для белого,
# зеленый, синий цвет.
white = ( 255 , 255 , 255 )
green = ( 0 , 255 , 0 )
blue = ( 0 , 0 , 128 )
# присваивание значений переменной X и Y
# создать объект отображаемой поверхности
# определенного размера..e (X, Y).
display_surface = pygame.display.set_mode((X, Y ))
# установить имя окна Pygame
pygame.display.set_caption( ‘Show Text’ )
# создать объект шрифта.
# 1-й параметр — это файл шрифта
# который присутствует в пигме.
# 2-й параметр — размер шрифта
font = pygame.font.Font( ‘freesansbold.ttf’ , 32 )
# создать текстовый объект suface,
# на котором нарисован текст.
text = font.render( ‘GeeksForGeeks’ , True , green, blue)
# создать прямоугольный объект для
# текстовая поверхность объекта
# установить центр прямоугольного объекта.
textRect.center = (X / / 2 , Y / / 2 )
# полностью заполнить поверхность объекта
# копирование объекта текстовой поверхности
# к объекту отображения поверхности
# в центральной координате.
# перебирать список объектов Event
# который был возвращен методом pygame.event.get ().
for event in pygame.event.get() :
# если тип объекта события QUIT
# затем выход из игры
# и запрограммируйте оба.
if event. type = = pygame.QUIT :
# деактивирует библиотеку pygame
# выйти из программы.
# Рисует поверхность объекта на экране.
Выход : 