Окно и рисование
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))— цвет точки.