Модуль pygame.font
Классы Font и SysFont находятся в модуле pygame.font и предназначены для работы со шрифтами и текстом. Чтобы создавать от этих классов объекты, модуль pygame.font необходимо предварительно инициализировать командой pygame.font.init() , или выполнить инициализацию всех вложенных модулей библиотеки Pygame командой pygame.init() .
От классов pygame.font.Font и pygame.font.SysFont создаются объекты-шрифты. Второй класс берет системные шрифты, поэтому конструктору достаточно передать имя шрифта. Конструктору Font надо передавать имя файла шрифта. Например:
pygame.font.SysFont('arial', 36) pygame.font.Font('/адрес/Arial.ttf', 36)
Пример полного адреса в системе Linux – «/usr/share/fonts/truetype/msttcorefonts/Arial.ttf».
Второй аргумент – это размер шрифта в пикселях.
Узнать, какие шрифты есть в системе, можно с помощью функции get_fonts() :
>>> pygame.font.get_fonts() ['cmmi10', 'umeminchos3', 'kacstbook' .
Узнать адрес конкретного шрифта:
>>> pygame.font.match_font('verdana') '/usr/share/fonts/. /Verdana.ttf'
Вы можете скопировать шрифт в каталог программы и обращаться к нему без адреса:
pygame.font.Font('Verdana.ttf', 24)
В pygame есть шрифт по-умолчанию. Чтобы использовать его, вместо имени файла в конструктор надо передать объект None :
pygame.font.Font(None, 24)
От обоих классов ( Font и SysFont ) создаются объекты типа Font .
Метод render() экземпляра Font создает поверхность (экземпляр Surface ), на которой «написан» переданный в качестве аргумента текст, шрифтом, к которому применяется метод. Вторым аргументом указывается сглаживание, третьим – цвет текста. При необходимости четвертым аргументом можно указать цвет фона.
import pygame import sys pygame.font.init() sc = pygame.display.set_mode((300, 200)) sc.fill((255, 255, 255)) f1 = pygame.font.Font(None, 36) text1 = f1.render('Hello Привет', True, (180, 0, 0)) f2 = pygame.font.SysFont('serif', 48) text2 = f2.render("World Мир", False, (0, 180, 0)) sc.blit(text1, (10, 50)) sc.blit(text2, (10, 100)) pygame.display.update() while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: sys.exit()
Рассмотрим такой пример:
import pygame as pg import sys pg.init() sc = pg.display.set_mode((400, 300)) sc.fill((200, 255, 200)) font = pg.font.Font(None, 72) text = font.render("Hello Wold", True, (0, 100, 0)) place = text.get_rect(center=(200, 150)) sc.blit(text, place) pg.display.update() while 1: for i in pg.event.get(): if i.type == pg.QUIT: sys.exit() pressed = pg.key.get_pressed() if pressed[pg.K_LEFT]: place.x -= 1 elif pressed[pg.K_RIGHT]: place.x += 1 sc.fill((200, 255, 200)) sc.blit(text, place) pg.display.update() pg.time.delay(20)

Вспомним, что метод get_rect() экземпляра Surface возвращает объект типа Rect , чьи размеры соответствуют размерам поверхности.
Поскольку у самой поверхности нет собственных свойств-координат на родительском окне, а у Rect они есть, то по умолчанию, если get_rect() применяется без аргументов, для его верхнего левого угла устанавливаются координаты (0, 0).
В нашем примере мы передаем в get_rect() значение для свойства center порождаемой прямоугольной области. Это свойство определяет координаты центра экземпляра Rect (то, что это еще и центр главного окна, неважно). При этом остальные координаты, в том числе координаты верхнего левого угла, вычисляются автоматически, исходя из установленного центра и размеров поверхности.
Поэтому, когда вызывается метод blit() , в который в качестве второго аргумента передается созданный экземпляр Rect , то из последнего берутся координаты верхнего левого угла. Но они уже не (0, 0), а имеют значения, которые равны свойству centerx минус половина ширины и centery минус половина высоты прямоугольной области или соответствующей ей поверхности.
При зажиме стрелок на клавиатуре координата x прямоугольника меняется. В результате метод blit() рисует поверхность в новых координатах.
Практическая работа
У объектов Rect есть метод contains() , который проверяет, заключает ли в себе одна область (к которой применяется метод) другую (которая передается в качестве аргумента).
Напишите программу, в которой, если одна поверхность попадает в пределы другой, то на главной поверхности появляется какая-либо надпись. «Подвижный» экземпляр Surface должен переноситься с помощью мыши.
Курс с примерами решений практических работ:
pdf-версия
X Скрыть Наверх
Pygame. Введение в разработку игр на Python
Разрабатываем игру на PyGame
Всем привет! Сегодня мы с вами попробруем на практике самую популярную библиотеку для создания игр на питоне — PyGame. С ее помощью мы создадим аналог классической аркады «астероиды».
Для этого мы научимся:
- создавать игровое окно и отображать фоновое изображение;
- создавать персонажа и реагировать на нажатия клавиш;
- добавлять астероиды, двигать их и реагировать на столкновения;
- выводить текст и анимацию взрывов.
Для начала работы нам понадобится установить питон (с сайта python.org) и библиотеку pygame. Для этого после установки питона нужно открыть терминал (командную строку) и выполнить команду pip install pygame .
Если все прошло хорошо, можно открывать ваше любимое IDE (например, встроенный в питон IDLE) и приступать к работе. Лучше выделить для нашего проекта отдельную папку, внутри которой мы будем создавать скрипты и сохранять изображения.

Создаем игровое окно
Первое, что потребуется сделать — создать пустое игровое окно и сделать игровой цикл.
Игровой цикл — это сердце любой игры, в нем все игровые объекты меняют свои координаты и перерисовываются. Одна итерация такого цикла — это и есть кадр (известный вам по термину FPS — количество кадров секунду).
При создании окна нам потребуется указать его размер и название, и написать простой цикл обработки событий. Событие — это информация от операционной системы, например, о нажатиях клавиш на клавиатуре или мыши, необходимости перерисовать окно или нажатии на «крестик».
import pygame pygame.init() # создаем окно размера 800 на 600 screen = pygame.display.set_mode((800, 600)) # указываем название pygame.display.set_caption("Asteroids") # игровой цикл while True: # обрабатываем события for e in pygame.event.get(): # если нажали на крестик if e.type == pygame.QUIT: # закрыть окно raise SystemExit("QUIT") # перерисовать окно pygame.display.update()

Добавляем фоновое изображение
Теперь добавим фоновое изображение. Для этого нам как минимум понадобится картинка, ее можно поискать в интернете или взять нашу.
Изображение в примере должно лежать в папке с нашим скриптом и называться sky.jpg .
import pygame # импортируем функцию для масштабирования картинок from pygame.transform import scale pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("Asteroids") # загружаем картинку из папки big_sky = pygame.image.load("sky.jpg") # масштабируем картинку под размер экрана sky = scale(big_sky, (800, 600)) while True: for e in pygame.event.get(): if e.type == pygame.QUIT: raise SystemExit("QUIT") # рисуем картинку с небом на экране screen.blit(sky, (0, 0)) pygame.display.update()

Добавляем игрока
Теперь добавим космический корабль. В PyGame, для любых перемещающихся объектов, которые могут взаимодействовать с другими удобно описать собственный класс, который будет наследоваться от встроенного класса Sprite . Спрайты можно рисовать, двигать, уничтожать и удобно объединять в группы.
Класс — это описание некоторой сущности, по сути — чертеж объекта. В нем описывается, какие свойства будут у объекта и какие действия он будет уметь совершать.
Давайте попытаемся описать класс для космического корабля и нарисовать его. В классе нам потребуется описать конструктор (для инициализации стартовых параметров), функции для рисования и перемещения корабля. Кстати, нам снова понадобится прозрачная картинка для корабля, можно поискать по запросу starship 2d asset или взять нашу.
import pygame from pygame.transform import scale # описываем класс "космический корабль", расширяющий встроенный класс Sprite class Spaceship(pygame.sprite.Sprite): # конструктор - функция, в которую мы передаем начальные координаты def __init__(self, x, y): # инициализируем спрайт pygame.sprite.Sprite.__init__(self) # выбираем прямоугольную область размера 50 на 100 self.rect = pygame.Rect(x, y, 50, 100) # загружаем картинку с кораблем self.image = scale(pygame.image.load("ship.png"), (50, 100)) # задаем начальную скорость по оси x self.xvel = 0 # функция рисования корабля def draw(self, screen): # рисуем корабль на экране на месте занимаемой им прямоугольной области screen.blit(self.image, (self.rect.x, self.rect.y)) # функция перемещения, параметры - нажата ли стрелочки влево и вправо def update(self, left, right): # если нажата клавиша влево, уменьшаем скорость if left: self.xvel -= 3 # если нажата клавиша вправо, увеличиваем скорость if right: self.xvel += 3 # если ничего не нажато - тормозим if not (left or right): self.xvel = 0 # изменяем координаты на скорость self.rect.x += self.xvel pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("Asteroids") sky = scale(pygame.image.load("sky.jpg"), (800, 600)) # создаем корабль в точке 400 400 ship = Spaceship(400, 400) while True: for e in pygame.event.get(): if e.type == pygame.QUIT: raise SystemExit("QUIT") # рисуем небо screen.blit(sky, (0, 0)) # просим корабль нарисоваться ship.draw(screen) pygame.display.update()

Настраиваем перемещение игрока
Несмотря на то, что мы описали функцию update , наш корабль при нажатии на стрелочки все-равно не движется. Проблема в том, что мы это функцию нигде не вызываем!
Ниже мы опишем вызов этой функции при срабатывании системных событий нажатия на клавиши, и корабль должен начать перемещаться влево и вправо.
Попробуйте добавить возможность перемещения вверх и вних, а также ограничить возможность перемещения за границы.
import pygame from pygame.transform import scale class Spaceship(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.rect = pygame.Rect(x, y, 50, 100) self.image = scale(pygame.image.load("ship.png"), (50, 100)) self.xvel = 0 def draw(self, screen): screen.blit(self.image, (self.rect.x, self.rect.y)) def update(self, left, right): if left: self.xvel -= 3 if right: self.xvel += 3 if not (left or right): self.xvel = 0 self.rect.x += self.xvel pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("Asteroids") sky = scale(pygame.image.load("sky.jpg"), (800, 600)) # создаем корабль в точке 400 400 ship = Spaceship(400, 400) # заведем переменные, чтобы помнить, какие клавиши нажаты left = False right = False while True: for e in pygame.event.get(): # если нажата клавиша - меняем переменную if e.type == pygame.KEYDOWN and e.key == pygame.K_LEFT: left = True if e.type == pygame.KEYDOWN and e.key == pygame.K_RIGHT: right = True # если отпущена клавиша - меняем переменную if e.type == pygame.KEYUP and e.key == pygame.K_LEFT: left = False if e.type == pygame.KEYUP and e.key == pygame.K_RIGHT: right = False if e.type == pygame.QUIT: raise SystemExit("QUIT") # рисуем небо screen.blit(sky, (0, 0)) # перемещаем корабль ship.update(left, right) # просим корабль нарисоваться ship.draw(screen) pygame.display.update()
Астероиды
Теперь самое время добавить астероиды. Для них нам так же потребуется описать собственный класс, но в отличие от игрока, они не будут реагировать на клавиши, а всегда будут двигаться вниз.
Кстати, нам снова понадобится картинка, можно взять нашу.

import pygame import random from pygame.transform import scale # создаем Астероид, расширяющий класс Спрайт class Asteroid(pygame.sprite.Sprite): # конструктор, в который передаются стартовые координаты def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) # загружаем картинку с астероидом и масштабируем под размер 50 на 50 self.image = scale(pygame.image.load("asteroid.png"), (50, 50)) # задаем прямоугольную область 50 на 50 self.rect = pygame.Rect(x, y, 50, 50) # задаем скорость self.yvel = 5 # функция рисования астероида def draw(self, screen): screen.blit(self.image, (self.rect.x, self.rect.y)) # функция перемещения астероида def update(self): self.rect.y += self.yvel # если астероид за границей карты - он умирает if self.rect.y > 900: self.kill() class Spaceship(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.rect = pygame.Rect(x, y, 50, 100) self.image = scale(pygame.image.load("ship.png"), (50, 100)) self.xvel = 0 def draw(self, screen): screen.blit(self.image, (self.rect.x, self.rect.y)) def update(self, left, right): if left: self.xvel -= 3 if right: self.xvel += 3 if not (left or right): self.xvel = 0 self.rect.x += self.xvel pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("Asteroids") sky = scale(pygame.image.load("sky.jpg"), (800, 600)) ship = Spaceship(400, 400) left = False right = False # создадим группу спрайтов, в которой будут храниться все астероиды asteroids = pygame.sprite.Group() while True: # с некоторой вероятность будем добавлять астероиды сверху экрана if random.randint(1, 1000) > 900: # выбираем координату по оси x asteroid_x = random.randint(-100, 700) # выбираем точку за верхней граничей экрана asteroid_y = -100 # создаем астероид asteroid = Asteroid(asteroid_x, asteroid_y) # и добавляем его в группу asteroids.add(asteroid) for e in pygame.event.get(): if e.type == pygame.KEYDOWN and e.key == pygame.K_LEFT: left = True if e.type == pygame.KEYDOWN and e.key == pygame.K_RIGHT: right = True if e.type == pygame.KEYUP and e.key == pygame.K_LEFT: left = False if e.type == pygame.KEYUP and e.key == pygame.K_RIGHT: right = False if e.type == pygame.QUIT: raise SystemExit("QUIT") # рисуем небо screen.blit(sky, (0, 0)) # перемещаем корабль ship.update(left, right) # просим корабль нарисоваться ship.draw(screen) # перемещаем и рисуем каждый астероид в группе for asteroid in asteroids: asteroid.update() asteroid.draw(screen) pygame.display.update()
Столкновения
Теперь попробуем добавить очки здоровья корабля, выводить их на экран и уменьшать при столкновениях с кораблем.

Попробуйте добавить закрытие игры или вывод надписи Game Over, когда жизнь опускается до нуля.
import pygame import random from pygame.transform import scale class Asteroid(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.image = scale(pygame.image.load("asteroid.png"), (50, 50)) self.rect = pygame.Rect(x, y, 50, 50) self.yvel = 5 def draw(self, screen): screen.blit(self.image, (self.rect.x, self.rect.y)) def update(self): self.rect.y += self.yvel if self.rect.y > 900: self.kill() class Spaceship(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.rect = pygame.Rect(x, y, 50, 100) self.image = scale(pygame.image.load("ship.png"), (50, 100)) self.xvel = 0 # добавим кораблю здоровье self.life = 100 def draw(self, screen): screen.blit(self.image, (self.rect.x, self.rect.y)) # добавим группу с астероидами в обновление координат корабля def update(self, left, right, asteroids): if left: self.xvel -= 3 if right: self.xvel += 3 if not (left or right): self.xvel = 0 self.rect.x += self.xvel # для каждого астероида for asteroid in asteroids: # если область, занимаемая астероидом пересекает область корабля if self.rect.colliderect(asteroid.rect): # уменьшаем жизнь self.life -= 1 pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("Asteroids") sky = scale(pygame.image.load("sky.jpg"), (800, 600)) ship = Spaceship(400, 400) left = False right = False asteroids = pygame.sprite.Group() # загрузим системный шрифт pygame.font.init() font = pygame.font.SysFont('Comic Sans MS', 30) while True: if random.randint(1, 1000) > 900: asteroid_x = random.randint(-100, 700) asteroid_y = -100 asteroid = Asteroid(asteroid_x, asteroid_y) asteroids.add(asteroid) for e in pygame.event.get(): if e.type == pygame.KEYDOWN and e.key == pygame.K_LEFT: left = True if e.type == pygame.KEYDOWN and e.key == pygame.K_RIGHT: right = True if e.type == pygame.KEYUP and e.key == pygame.K_LEFT: left = False if e.type == pygame.KEYUP and e.key == pygame.K_RIGHT: right = False if e.type == pygame.QUIT: raise SystemExit("QUIT") screen.blit(sky, (0, 0)) # добавим группу астероидов в параметры ship.update(left, right, asteroids) ship.draw(screen) for asteroid in asteroids: asteroid.update() asteroid.draw(screen) # выведем жизнь на экран белым цветом life = font.render(f'HP: ', False, (255, 255, 255)) screen.blit(life, (20, 20)) pygame.display.update()
Анимация столкновений
При столкновении астероида и корабля можно попробовать добавить анимацию взрывов на корабле.
Для этого можно взять раскадровку взрыва и разрезать ее на части, например, используя веб-сервис. Получившиеся кадры можно положить в папку explosion.
Кстати, полный код того, что у нас получилось всегда можно будет скачать на гитхабе.

import pygame import random from pygame.transform import scale class Explosion(pygame.sprite.Sprite): def __init__(self, x, y): self.rect = pygame.Rect(x, y, 40, 40) self.images = [] self.index = 0 for i in range(8): image = scale(pygame.image.load(f"explosion/tile00.png"), (40, 40)) self.images.append(image) def draw(self, screen): if self.index < 8: screen.blit(self.images[self.index], (self.rect.x, self.rect.y)) self.index += 1 class Spaceship(pygame.sprite.Sprite): def __init__(self, x, y): self.rect = pygame.Rect(x, y, 50, 100) self.image = scale(pygame.image.load("ship.png"), (50, 100)) self.xvel = 0 self.life = 100 self.explosions = [] def draw(self, screen): screen.blit(self.image, (self.rect.x, self.rect.y)) for explosion in self.explosions: explosion.draw(screen) def update(self, left, right, asteroids): if left: self.xvel += -3 if right: self.xvel += 3 if not (left or right): self.xvel = 0 for asteroid in asteroids: if self.rect.colliderect(asteroid.rect): self.life -= 1 rx = random.randint(-5, 40) ry = random.randint(-5, 40) explosion = Explosion(self.rect.x + rx, self.rect.y + ry) self.explosions.append(explosion) self.rect.x += self.xvel class Asteroid(pygame.sprite.Sprite): def __init__(self, x, y): self.image = scale(pygame.image.load("asteroid.png"), (50, 50)) self.rect = pygame.Rect(x, y, 50, 50) self.yvel = 5 def draw(self, screen): screen.blit(self.image, (self.rect.x, self.rect.y)) def update(self): self.rect.y += self.yvel pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("Asteroids") timer = pygame.time.Clock() sky = scale(pygame.image.load("sky.jpg"), (800, 600)) ship = Spaceship(400, 400) left = False right = False asteroids = [] pygame.font.init() font = pygame.font.SysFont('Comic Sans MS', 30) while True: if random.randint(1, 1000) >900: asteroid_x = random.randint(-100, 700) asteroid_y = -100 asteroid = Asteroid(asteroid_x, asteroid_y) asteroids.append(asteroid) timer.tick(60) for e in pygame.event.get(): if e.type == pygame.KEYDOWN and e.key == pygame.K_LEFT: left = True if e.type == pygame.KEYDOWN and e.key == pygame.K_RIGHT: right = True if e.type == pygame.KEYUP and e.key == pygame.K_LEFT: left = False if e.type == pygame.KEYUP and e.key == pygame.K_RIGHT: right = False if e.type == pygame.QUIT: raise SystemExit("QUIT") screen.blit(sky, (0, 0)) ship.update(left, right, asteroids) ship.draw(screen) for asteroid in asteroids: asteroid.update() asteroid.draw(screen) textsurface = font.render(f'HP: ', False, (255, 255, 255)) screen.blit(textsurface, (20, 20)) pygame.display.update()
2D RGP — перемещение персонажа в разные стороны и камера
По ссылке https://github.com/roctbb/rpg-template находится шаблон RPG игры на PyGame. В нем персонаж передвигается по лесу и собирает монеты.
В отличие от примера с астероидами в игру добавлены следующие изменения:
- объекты в игре в начале отрисовываются из карты;
- карта больше чем экран, при перемещении игрока перемещается камера;
- на карте есть проходимые и непроходимые объекты;
- анимация игрока — разная в разных направлениях.
Структура проекта:
- images — папка с картинками;
- game.py — основной файл игры;
- game_platform.py — описание вспомогательных объектов (вода, деревья, камни, монеты);
- player.py — описание класса «игрок».
Как вывести текст в питоне в окне: простой способ для начинающих
Чтобы вывести текст в окне в Python, вы можете использовать функцию print(). Просто передайте текст, который вы хотите вывести, в качестве аргумента в функцию print(). Вот пример:
print("Привет, мир!")
Этот код выведет «Привет, мир!» в окне консоли.
Детальный ответ
Как вывести текст в питоне в окне
Добро пожаловать! В этой статье мы расскажем вам, как вывести текст в питоне в окне. Это очень полезный навык при разработке программ, особенно при создании графических пользовательских интерфейсов (GUI). Мы познакомимся с различными способами вывода текста в питоне и рассмотрим примеры использования.
1. Использование функции print()
Наиболее простым способом вывода текста в питоне является использование функции print(). Эта функция позволяет вывести текст на консоль. Например:
print("Привет, мир!")
Этот код выведет на консоль текст «Привет, мир!». Однако, если вы хотите вывести текст в окне, а не на консоль, вам потребуется использовать специальные библиотеки для создания GUI.
2. Использование библиотеки Tkinter
Библиотека Tkinter является одной из наиболее популярных библиотек для создания графических пользовательских интерфейсов на питоне. Она включена в стандартную библиотеку питона, поэтому вам не потребуется устанавливать ее отдельно. Чтобы вывести текст в окно при использовании Tkinter, вы можете использовать виджет Label. Вот пример:
import tkinter as tk window = tk.Tk() label = tk.Label(window, text="Привет, мир!") label.pack() window.mainloop()
Этот код создаст простое окно с надписью «Привет, мир!». Вы можете изменить текст, заменив «Привет, мир!» на любую другую строку.
3. Использование других библиотек
- PyQt
- PyGTK
- wxPython
Каждая из этих библиотек имеет свои особенности и возможности. Вы можете выбрать ту, которая лучше всего подходит для вашего проекта.
Заключение
В этой статье мы рассмотрели различные способы вывода текста в питоне в окне. Мы начали с использования функции print() для вывода текста на консоль, а затем перешли к использованию библиотеки Tkinter для создания графических пользовательских интерфейсов. Мы также упомянули о других библиотеках, которые также могут быть полезны при создании оконных приложений.
Надеюсь, эта статья была полезна для вас! Если у вас есть еще вопросы или вы хотите узнать больше о программировании на питоне, не стесняйтесь задавать вопросы и исследовать дальше. Удачи в вашем путешествии в мир программирования!
Стрелялка с Pygame №7: счет и рендеринг текста
Седьмая часть проекта «Стрелялка с Pygame». Если пропустили, обязательно вернитесь и начните с первой части. В этот раз начнем вести счет и научимся выводить текст на экран.
В этой серии уроков будет создана полноценная игра на языке Python с помощью библиотеки Pygame. Она будет особенно интересна начинающим программистам, которые уже знакомы с основами языка и хотят углубить знания, а также узнать, что лежит в основе создания игр.
Ведение счета
Ведение счет игрока — простая задача. Нужно переменная с начальным значением 0, к которой будет добавляться +1 при каждом уничтожении астероида. Поскольку астероиды разные, а в крупные попасть легче, чем в маленькие, есть смысл в том, чтобы давать больше очков за уничтожение тех, что поменьше.
Назовем переменную score и объявим ее до игрового цикла:
for i in range(8): m = Mob() all_sprites.add(m) mobs.add(m) score = 0 # Цикл игры running = True
Чтобы назначать очки в зависимости от размера астероида, можно использовать свойство radius . У самых крупных астероидов изображение больше 100 пикселей, а радиус 100 * 0.85 / 2 = 43 пикселя. В то же время радиус самого маленького астероида — всего 8 пикселей. Можно вычитать радиус из большего числа, например 50, чтобы получать количество очков. Так, большой будет давать всего 7 очков, а маленький — 42 очка.
# проверка, попала ли пуля в моб hits = pygame.sprite.groupcollide(mobs, bullets, True, True) for hit in hits: score += 50 - hit.radius m = Mob() all_sprites.add(m) mobs.add(m)
Рендеринг текста
Теперь, когда есть переменная со счетом, нужно отрисовывать ее на экране, и вот это уже посложнее. Делается все в несколько этапов. Если вы планируете выводить текст не один раз, тогда есть смысла создать функцию, которая будет называться draw_text . Ее параметры:
- surf — поверхность, на которой текст будет написан
- text — строка, которую нужно отображать
- x, y — положение
Также нужно выбрать шрифт. Проблема может возникнуть, если выбрать тот шрифт, который не установлен на компьютере. Решить это можно с помощью pygame.font.match_font() , которая ищет наиболее подходящий шрифт в системе.
Вот вся функция draw_text :
font_name = pygame.font.match_font('arial') def draw_text(surf, text, size, x, y): font = pygame.font.Font(font_name, size) text_surface = font.render(text, True, WHITE) text_rect = text_surface.get_rect() text_rect.midtop = (x, y) surf.blit(text_surface, text_rect)
Отрисовка текста на экране — это, фактически, вычисление необходимой структуры пикселей. В компьютерной графике это называется «рендерингом». За это будет отвечать функция font.render() . В функции есть неизвестный параметр True , который отвечает за включение и отключение сглаживания.
Сглаживание
Если вы когда-нибудь пытались нарисовать что-нибудь пикселями (или, например, блоками в Minecraft), то знаете, насколько сложно изображать изогнутые линии на квадратной сетке. Максимум, что выходит, — зубчатая форма. Такая зубчатость называется «алиасингом». Вот как она выглядит:
Первая «a» выглядит чересчур угловатой из-за алиасинга. Сглаживание (анти-алиасинг) — это то, как современные компьютеры работают с текстом, чтобы он не был настолько зубчатым. Это происходит с помощью смешивания пикселей с фоном на границах объектов. В уменьшенном масштабе такой шрифт выглядит чисто и аккуратно.
Отображение счета
Теперь можно показывать счет на экране. Нужно лишь добавить его в раздел отрисовки в верхней части экрана по центру.
# Рендеринг screen.fill(BLACK) screen.blit(background, background_rect) all_sprites.draw(screen) draw_text(screen, str(score), 18, WIDTH / 2, 10)

Вот и все. В следующей раз будем работать с музыкой и звуками.
