Рисуем фигуры: 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вместо «голых» четвёрок чисел — про него следующий урок.
Итог: прямоугольник, круг и линия — твой стартовый набор. С ними можно собрать играбельный прототип ещё до первой картинки.