Рисуем фигуры: rect, circle, line

Прежде чем грузить красивые картинки, научимся рисовать примитивы: прямоугольники, круги, линии. Из них собирается прототип любой игры.
Суть: Pygame умеет рисовать фигуры прямо на экране через модуль pygame.draw. Прямоугольник, круг, линия — этого хватает, чтобы собрать играбельный прототип за вечер.

Многие новички застревают, потому что хотят сразу красивую графику и тратят неделю на поиск спрайтов. Профессионалы делают наоборот: сначала «серые коробки». Герой — прямоугольник, враг — круг, пуля — линия. Это называется прототипированием: проверяем, что игра интересна, ещё до того как нарисован хоть один пиксель арта. Заменить коробку на спрайт — дело пяти минут, а вот понять, весело ли играть, гораздо важнее.

Модуль pygame.draw рисует фигуры прямо на поверхности окна. Каждая функция принимает поверхность, цвет и геометрию. Цвет — это тройка (R, G, B), где каждое число от 0 до 255. (255, 0, 0) — ярко-красный, (255, 255, 255) — белый, (0, 0, 0) — чёрный.

Как работает под капотом

Прямоугольник в Pygame описывается четырьмя числами: x, y — координаты левого верхнего угла, и width, height — ширина и высота. Это и есть знаменитый Rect, главный «строительный кубик» движка:

        (x, y)
          +-------------------+   ^
          |                   |   |
          |    Rect(x, y,     |  height
          |        w, h)      |   |
          +-------------------+   v
          <------ width ------>

   left = x        right  = x + width
   top  = y        bottom = y + height

Вот как рисуются базовые фигуры (читаем):

import pygame
screen.fill((20, 20, 30))

# прямоугольник: (поверхность, цвет, (x, y, w, h))
pygame.draw.rect(screen, (80, 200, 120), (100, 100, 120, 60))

# круг: (поверхность, цвет, центр(x,y), радиус)
pygame.draw.circle(screen, (240, 200, 60), (400, 300), 40)

# линия: (поверхность, цвет, начало, конец, толщина)
pygame.draw.line(screen, (220, 80, 80), (0, 0), (800, 600), 3)

pygame.display.flip()

Геометрия прямоугольника — чистая арифметика, проверяемая без графики. Посчитаем его грани и центр (эти же формулы Pygame использует внутри Rect). Попробуй сам:

def rect_info(x, y, w, h):
    return {
        "left": x, "right": x + w,
        "top": y, "bottom": y + h,
        "center": (x + w // 2, y + h // 2),
    }

info = rect_info(100, 100, 120, 60)
for name, value in info.items():
    print(name, "=", value)

Заливка фигур и контуры

У функций рисования есть необязательный последний аргумент — толщина линии. Если его не указать или поставить 0, фигура заливается сплошным цветом. Если задать число больше нуля, рисуется только контур этой толщины, а внутри пусто. Это удобно: рамку выделения врага рисуют контуром, а самого героя — заливкой. Один и тот же draw.rect даёт и сплошной блок, и аккуратную обводку — всё решает один параметр.

Важно понимать порядок отрисовки: то, что нарисовано позже, ложится поверх нарисованного раньше, как слои аппликации. Поэтому сначала рисуют фон, потом платформы, потом героя, и в самом конце — интерфейс со счётом поверх всего. Если перепутать порядок, герой спрячется за фоном или счёт уедет под платформу. Этот принцип «сначала дальнее, потом ближнее» называется художественным алгоритмом (painter algorithm), и он лежит в основе всей 2D-графики. Держи отрисовку в осмысленном порядке слоёв — и сцена всегда будет выглядеть правильно.

Стоит сразу завести себе палитру — небольшой набор именованных цветов в начале файла. Когда у тебя есть BG, HERO, ENEMY, COIN, код читается как описание сцены, а не как поток непонятных троек чисел. А главное — единый стиль: поменяв одну константу, ты перекрасишь всех врагов разом. Помимо прямоугольника, круга и линии, в pygame.draw есть polygon для произвольных многоугольников (треугольный кораблик, звезда), ellipse для овалов и arc для дуг. Этого набора хватает, чтобы нарисовать почти любой простой объект геометрией, вообще без картинок, — многие стильные минималистичные игры так и сделаны. Прототипируй фигурами смело: серая коробка, ставшая интересной игрой, всегда лучше красивого спрайта в скучной механике.

Частые ошибки

  • Путать (x, y, w, h) с (x1, y1, x2, y2) — Rect задаётся углом и размерами, а не двумя углами.
  • Цвет с числом больше 255 — вызовет ошибку или странный цвет.
  • Рисовать на экране до fill() — увидишь мусор от прошлого кадра.

Best practices

  • Прототипируй фигурами, арт добавляй потом — экономит дни работы.
  • Заводи константы цветов: GREEN = (80, 200, 120).
  • Используй Rect вместо «голых» четвёрок чисел — про него следующий урок.

Итог: прямоугольник, круг и линия — твой стартовый набор. С ними можно собрать играбельный прототип ещё до первой картинки.

Проверьте себя
1. Какими четырьмя числами задаётся прямоугольник Rect?
Ax1, y1, x2, y2
Bx, y, width, height
Cцентр и радиус
Dугол и площадь
2. В каком диапазоне задаётся каждая компонента RGB-цвета?
Aот 0 до 1
Bот 0 до 100
Cот 0 до 255
Dот -255 до 255