Основы PyGame

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

Документация, обучающие материалы и дополнительная информация доступна разработчикам на сайте проекта: https://www.pygame.org/docs/

Начало работы

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

import pygame
import sys

pygame.init()

screen = pygame.display.set_mode((1200, 800))

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

В первую очередь импортируем модуль pygame в наш файл с исходным кодом:

import pygame

Затем вызываем функцию init() для подготовки модулей pygame к работе:

pygame.init()

После этого создаем графическое окно, передав в качестве аргумента в функцию set_mode() его разрешение в виде пары целых чисел. В свою очередь функция вернет нам объект типа Surface, используемый для представления изображений:

screen = pygame.display.set_mode((1200, 800))

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

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

После того как ожидаемое событие наступило, завершаем работу с библиотекой pygame вызовом функции pygame.quit() и нашей программы вызовом функции exit() из модуля sys.

Рисование геометрических фигур

Разместим в окне нашего приложения прямоугольник. Прямоугольные объекты представлены типом Rect:

Rect(left, top, width, height)
Rect((left, top), (width, height))

Для создания объекта этого типа нам необходимо указать координаты левого верхнего угла прямоугольника и длины его сторон:

r = Rect(0, 0, 100, 200)

Обратите внимание, что начало координат (0, 0) находится в левом верхнем углу окна.

В библиотеке pygame функции отображения геометрических фигур находятся в модуле draw. Нарисуем прямоугольник c помощью функции rect():

rect(Surface, color, Rect, width=0) -> Rect

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

Рассмотрим готовый пример:

import pygame
import sys

pygame.init()

screen = pygame.display.set_mode((1000, 800))
r = pygame.Rect(50, 50, 100, 200)
pygame.draw.rect(screen, (255, 0, 0), r, 0)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.flip()

Обратите внимание на последнюю строку нашей программы. На самом деле графические объекты которые мы хотим разместить на основном экране сначала попадают в специальный буфер. Чтобы отобразить изменения стали видны вызываем функцию flip().

Прочие функции для рисования графических фигур

pygame.draw.line(Surface, color, start_pos, end_pos, width=1)

Нарисовать линию на поверхности Surface, цветом color, с началом в точке start_pos, концом в точке end_pos и толщиной линии width.

pygame.draw.lines(Surface, color, closed, pointlist, width=1)

Нарисовать линию, соединяющую точки из последовательности pointlist на поверхности Surface, цветом color, с толщиной линии width. Каждая точка представлена парой координат. Если параметр closed равен True, конечная точка соединяется с начальной.

pygame.draw.circle(Surface, color, pos, radius, width=0)

Нарисовать окружность на поверхности Surface, цветом color, с центром в точке pos и радиусом radius. Если толщина линии width равна нулю, окружность закрашивается.

pygame.draw.ellipse(Surface, color, Rect, width=0)

Нарисовать эллипс, ограниченный прямоугольником Rect, на поверхности Surface, цветом color. Если толщина линии width равна нулю, эллипс закрашивается.

pygame.draw.polygon(Surface, color, pointlist, width=0)

Нарисовать многоугольник по точкам из последовательности pointlist на поверхности Surface, цветом color, с толщиной линии width. Каждая точка представлена парой координат. Если толщина линии width равна нулю многоугольник закрашивается.

Цвет

Цвета в библиотеке pygame представлены в соответствии с моделью RGB: https://ru.wikipedia.org/wiki/RGB

Значение для цвета можно задать тройкой чисел, каждое из которых лежит в диапазоне от 0 до 255. Первое значение в последовательности определяет, какое количество красного содержится в данном оттенке, второе - зеленого, третье - голубого. Чем меньше значение числа, тем темнее будет оттенок. Например, красный цвет можно представить как (255, 0, 0), белый как (255, 255, 255), а черный как (0, 0, 0).

Помимо этого, в модуле color из библиотеки pygame содержится словарь THECOLORS, ключами которого являются названия различных цветовых оттенков. Подключить его можно с помощью команды:

from pygame.color import THECOLORS

Закрасим основной экран c помощью метода fill():

screen = pygame.display.set_mode((1200, 800))
screen.fill(THECOLORS['orange'])

Текст и шрифты

При работе с текстом мы будем использовать шрифты - группы символов объединенных по стилистическому или иному признаку. Шрифты в библиотеке pygame представлены типом Font

Чтобы создать объект Font на основе имеющегося в системе шрифта вызовем следующую функцию:

SysFont(name, size, bold=False, italic=False)

С помощью параметра name передаем в функцию имя шрифта, параметр size - размер шрифта в пунктах. Параметры bold и italic отвечают за начертание шрифта.

Список имеющихся в системе шрифтов можно получить с помощью функции get_fonts():

pygame.font.get_fonts() -> list of strings

Далее, с помощью метода render() нашего объекта типа Font получаем изображение с текстом, которое передаем на вход методу blit() для отрисовке на нашем основном экране:

screen = pygame.display.set_mode(size)
screen.fill(THECOLORS['white'])
font = pygame.font.SysFont('couriernew', 40)
text = font.render(str('HELLO'), True, THECOLORS['green'])
screen.blit(text, (50, 50))

Текст размещается в на основном экране по координатам (50, 50)

Задания

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

2. Используя функции для работы с графикой библиотеки pygame, нарисуйте белый флаг с олимпийскими кольцами.

3. Разработайте программу, которая разбивает основное игровое окно на клетки заданного размера.

4. Доработайте программу так, чтобы в каждой клетке был записан её порядковый номер.

5. Доработайте в программу возможность закрашивания клетки с произвольным номером случайным цветом. Номера клеток которые необходимо закрасить считывать из файла.