Menu
CoddyTech

Шпаргалка по pygame

Последнее обновление

Установка и игровой цикл

Каждая программа на pygame открывает окно, а затем повторяет один цикл, пока игрок не выйдет.

ДействиеКод
Установить pygame-cepython3 -m pip install pygame-ce
Импортировать и запустить pygameimport pygame pygame.init()
Открыть окноscreen = pygame.display.set_mode((640, 480))
Задать заголовок окнаpygame.display.set_caption("My Game")
Создать часыclock = pygame.time.Clock()
Игровой циклrunning = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill("black") pygame.display.flip() clock.tick(60)
Завершить работу после циклаpygame.quit()

Экран

Экран является объектом Surface: ничего не появится, пока вы не вызовете flip.

ДействиеКод
Показать готовый кадрpygame.display.flip()
Обновить только часть экранаpygame.display.update([rect1, rect2])
Очистить экранscreen.fill((30, 30, 46))
Размер окнаscreen.get_size(), screen.get_width()
Экран как Rectscreen.get_rect()
Окно с изменяемым размеромpygame.display.set_mode((640, 480), pygame.RESIZABLE)
Полный экран в разрешении рабочего столаpygame.display.set_mode((0, 0), pygame.FULLSCREEN)

Цвета и рисование

Функции pygame.draw принимают поверхность, цвет и позицию. width=0 заливает фигуру.

ДействиеКод
Цвет в RGB(255, 140, 0)
Цвет по имени или в hex"tomato", "#ff8c00", pygame.Color("gold")
Прямоугольникpygame.draw.rect(screen, "red", (x, y, w, h))
Контур и скруглённые углыpygame.draw.rect(screen, "red", rect, width=2, border_radius=8)
Круг (по центру)pygame.draw.circle(screen, "blue", (cx, cy), radius)
Линияpygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3)
Многоугольникpygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)])
Эллипс внутри прямоугольникаpygame.draw.ellipse(screen, "purple", (x, y, w, h))

Rect

Rect хранит позицию и размер целыми числами.

ДействиеКод
Создать Rectplayer = pygame.Rect(x, y, width, height)
Поставить по любой точкеplayer.center = (320, 240), player.bottom = 400
Стороны и углыleft, right, top, bottom, topleft, midbottom
Сдвинуть на местеplayer.move_ip(dx, dy)
Сдвинутая копияmoved = player.move(dx, dy)
Удержать внутри экранаplayer.clamp_ip(screen.get_rect())
Увеличить вокруг центраbigger = player.inflate(20, 20)
Дробные координаты (pygame-ce)pygame.FRect(10.5, 20.25, 40, 40)

Изображения, Surface и blit

Загружайте изображения один раз до цикла, а затем выводите их через blit в каждом кадре.

ДействиеКод
Загрузить изображение с прозрачностьюimg = pygame.image.load("player.png").convert_alpha()
Загрузить изображение без прозрачностиbg = pygame.image.load("sky.png").convert()
Нарисовать изображениеscreen.blit(img, (x, y))
Нарисовать по центруscreen.blit(img, img.get_rect(center=(320, 240)))
Новая пустая Surfacepanel = pygame.Surface((200, 100))
Прозрачная Surfacelayer = pygame.Surface((200, 100), pygame.SRCALPHA)
Сделать всю Surface полупрозрачнойimg.set_alpha(128)
Вырезать кадр из спрайт-листаframe = sheet.subsurface((0, 0, 32, 32))
Сохранить скриншотpygame.image.save(screen, "shot.png")

Преобразования

Каждая функция возвращает новую Surface; преобразуйте оригинал, а не последний результат.

ДействиеКод
Изменить размерpygame.transform.scale(img, (64, 64))
Масштабировать с коэффициентомpygame.transform.scale_by(img, 2)
Плавно изменить размерpygame.transform.smoothscale(img, (64, 64))
Повернуть (против часовой стрелки, в градусах)pygame.transform.rotate(img, 45)
Повернуть вокруг центраrotated = pygame.transform.rotate(original, angle) rect = rotated.get_rect(center=rect.center)
Отразить по горизонталиpygame.transform.flip(img, True, False)

События и клавиатура

События нужны для одиночных нажатий, а get_pressed() для удерживаемых клавиш.

ДействиеКод
Прочитать события этого кадраfor event in pygame.event.get():
Окно закрытоevent.type == pygame.QUIT
Нажата клавишаevent.type == pygame.KEYDOWN and event.key == pygame.K_SPACE
Отпущена клавишаevent.type == pygame.KEYUP
Введённый символevent.unicode
Клавиши, зажатые сейчасkeys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= 5
Направление по двум клавишамdx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
Клавиши, нажатые в этом кадре (pygame-ce)pygame.key.get_just_pressed()[pygame.K_SPACE]
Константы клавишK_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT
Название клавишиpygame.key.name(event.key)
Своё событиеHIT = pygame.event.custom_type() pygame.event.post(pygame.event.Event(HIT))

Мышь

Кнопки: 1 левая, 2 средняя, 3 правая.

ДействиеКод
Нажата кнопкаevent.type == pygame.MOUSEBUTTONDOWN and event.button == 1
Где её нажалиevent.pos
Позиция курсора сейчасx, y = pygame.mouse.get_pos()
Кнопки, зажатые сейчасleft, middle, right = pygame.mouse.get_pressed()
Мышь сдвинуласьevent.type == pygame.MOUSEMOTION, event.rel
Прокручено колесоevent.type == pygame.MOUSEWHEEL, event.y
Клик внутри кнопкиbutton_rect.collidepoint(event.pos)
Скрыть курсорpygame.mouse.set_visible(False)

Спрайты и группы

У спрайта есть image и rect; группа обновляет и рисует сразу много спрайтов.

ДействиеКод
Класс спрайтаclass Coin(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = coin_img self.rect = self.image.get_rect(center=pos)
Создать группуcoins = pygame.sprite.Group()
Добавить в группуcoins.add(Coin((100, 50)))
Обновить все спрайтыcoins.update()
Нарисовать все спрайтыcoins.draw(screen)
Удалить спрайт из всех группcoin.kill()
Группа из одного спрайтаplayer = pygame.sprite.GroupSingle(Player())

Столкновения

Rect сталкиваются, когда перекрываются; простое касание краями не считается.

ДействиеКод
Два прямоугольникаa.colliderect(b)
Точка внутриrect.collidepoint(x, y)
Первый из несколькихrect.collidelist(walls) # index or -1
Спрайт с группойhits = pygame.sprite.spritecollide(player, coins, True)
Есть ли хоть одно столкновениеpygame.sprite.spritecollideany(player, enemies)
Группа с группойpygame.sprite.groupcollide(bullets, enemies, True, True)
С точностью до пикселяpygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask)
Кругиpygame.Vector2(a).distance_to(b) < r1 + r2

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

Отрисуйте текст на Surface, а затем выведите её через blit.

ДействиеКод
Шрифт по умолчаниюfont = pygame.font.Font(None, 36)
Системный шрифтfont = pygame.font.SysFont("arial", 24)
Файл шрифтаfont = pygame.font.Font("pixel.ttf", 32)
Отрисовать текстtext = font.render("Score: 10", True, "white")
Нарисовать по центруscreen.blit(text, text.get_rect(center=(320, 40)))
Перенос длинного текста (pygame-ce)font.render(story, True, "white", None, 400)
Размер без отрисовкиfont.size("Hello")
Установленные шрифтыpygame.font.get_fonts()

Звук и музыка

Загружайте звуки один раз. Музыка воспроизводит один трек потоком прямо из файла.

ДействиеКод
Загрузить звукjump = pygame.mixer.Sound("jump.ogg")
Воспроизвестиjump.play()
Громкость звукаjump.set_volume(0.5)
Загрузить музыкуpygame.mixer.music.load("theme.ogg")
Зациклить музыкуpygame.mixer.music.play(-1)
Пауза и продолжениеpygame.mixer.music.pause(), pygame.mixer.music.unpause()
Остановить музыкуpygame.mixer.music.stop()

Время и таймеры

Тики измеряются в миллисекундах.

ДействиеКод
Ограничить частоту кадровclock.tick(60)
Дельта времени в секундахdt = clock.tick(60) / 1000
Текущая частота кадровclock.get_fps()
Миллисекунды с момента initpygame.time.get_ticks()
Повторяющееся событие таймераSPAWN = pygame.event.custom_type() pygame.time.set_timer(SPAWN, 1000)
Одноразовый таймерpygame.time.set_timer(SPAWN, 2000, loops=1)
Остановить таймерpygame.time.set_timer(SPAWN, 0)

Vector2

Дробные числа для позиций и скоростей.

ДействиеКод
Создать векторpos = pygame.Vector2(100, 200)
Сдвинуть на скоростьpos += velocity * dt
Длинаvelocity.length()
Одинаковая скорость по диагоналиif direction.length() > 0: direction = direction.normalize()
Расстояние между точкамиpos.distance_to(target)
Повернутьvelocity.rotate(90)
Шаг к точке (pygame-ce)pos.move_towards_ip(target, 5)

Код pygame, который нужен при создании 2D-игры на Python, сгруппирован по задачам: игровой цикл, окно, цвета и рисование, Rect, изображения и blit, масштабирование и поворот, ввод с клавиатуры и мыши, спрайты и группы, столкновения, текст, звук, таймеры и Vector2. В каждой строке короткий фрагмент кода, который можно вставить, а рядом описание того, что он делает.

Всё здесь написано для pygame-ce 2.5, версии pygame от сообщества, которую по-прежнему импортируют через import pygame. Строки с пометкой pygame-ce используют её дополнения; все остальные строки работают и в оригинальном pygame. Любой фрагмент можно попробовать в песочнице pygame, которая запускает pygame прямо в браузере без установки. Только начинаете изучать Python? Начните со шпаргалки по Python.

Частые вопросы о шпаргалке по pygame

Эта шпаргалка по pygame бесплатная?

Да. Она бесплатная и не требует регистрации. Добавьте её в закладки или сохраните в PDF через печать в браузере и возвращайтесь, когда понадобится точный вызов для группы спрайтов, звука или проверки столкновений.

Подходит ли эта шпаргалка для pygame и pygame-ce?
Да. Оба импортируются через import pygame, и API у них почти полностью общий. Строки с пометкой pygame-ce (FRect, scale_by, get_just_pressed, перенос текста и move_towards_ip) требуют pygame-ce, а всё остальное работает в обоих.
Почему окно pygame не отвечает?
Игровой цикл не читает события. Вызывайте pygame.event.get() один раз в каждом кадре, даже если события вам не нужны, и заканчивайте каждый кадр вызовами pygame.display.flip() и clock.tick(60).
Что использовать для ввода: события или key.get_pressed()?
Используйте событие KEYDOWN для действий, которые происходят один раз за нажатие, например для прыжка или открытия меню. Используйте pygame.key.get_pressed() для действий, которые длятся, пока клавиша зажата, например для ходьбы.
Иллюстрация языков программирования Coddy

Изучайте Pygame с Coddy

Начать