</>
Topic 2 of 6

Course materials are currently available in Russian only.

Окно и рисование

pygame — библиотека для создания 2D-игр на Python: окно, рисование, клавиатура и мышь, звук, спрайты. На ней пишут аркады, головоломки, прототипы игр.

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

Минимальная игра

import pygame

pygame.init()                                   # подготовить модули pygame
screen = pygame.display.set_mode((640, 480))    # окно 640 × 480 пикселей
pygame.display.set_caption("Моя игра")
clock = pygame.time.Clock()

running = True
while running:                                  # игровой цикл: один проход — один кадр
    for event in pygame.event.get():            # 1. события: клавиши, мышь, закрытие окна
        if event.type == pygame.QUIT:
            running = False
    screen.fill((30, 30, 40))                   # 2. рисуем кадр заново
    pygame.draw.circle(screen, (255, 200, 0), (320, 240), 50)
    pygame.display.flip()                       # 3. показываем нарисованное
    clock.tick(60)                              # не больше 60 кадров в секунду

pygame.quit()

Любая игра на pygame устроена так: цикл, в котором каждый кадр обрабатываются события, обновляется состояние и рисуется картинка.

  • clock.tick(60) притормаживает цикл, чтобы игра шла с одинаковой скоростью на любом компьютере.
  • Без обработки pygame.QUIT окно не закроется по крестику.

Координаты и цвета

Точка (0, 0) — левый верхний угол. x растёт вправо, y — вниз.

Цвет — тройка чисел от 0 до 255: красная, зелёная и синяя составляющие (RGB). (255, 0, 0) — красный, (0, 0, 0) — чёрный, (255, 255, 255) — белый.

Поверхности и рисование

Всё, на чём рисуют, — поверхность (Surface). Экран — тоже поверхность. Можно создать и свою, невидимую: pygame.Surface((100, 50)).

surface.fill((0, 0, 0))                                    # залить целиком
pygame.draw.rect(surface, color, (x, y, w, h))             # прямоугольник
pygame.draw.circle(surface, color, (cx, cy), radius)       # круг
pygame.draw.line(surface, color, (x1, y1), (x2, y2))       # линия толщиной 1
pygame.draw.rect(surface, color, (x, y, w, h), 2)          # только рамка толщиной 2
print(surface.get_at((x, y)))                              # цвет точки
print(surface.get_size())                                  # (ширина, высота)

Прямоугольник (x, y, w, h) закрашивает пиксели с x от x до x + w - 1 и y от y до y + h - 1.

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

Как проверяются задачи

Игровой цикл в каждой программе стоит под if __name__ == "__main__":. Когда вы нажимаете «Запустить у себя», он работает и открывается окно. При «Отправить» проверка импортирует ваш код без игрового цикла, вызывает функции рисования на невидимой поверхности и смотрит цвета нужных точек. Поэтому чинить нужно именно функцию, а не цикл.

Итог

  • pygame.init(), display.set_mode, цикл с event.get(), flip() и clock.tick();
  • (0, 0) — левый верхний угол, y растёт вниз;
  • fill, draw.rect, draw.circle, draw.line; рисунок ложится поверх предыдущего;
  • get_at((x, y)) — цвет точки.