Урок 11: Введение в Pygame

Создание игр на Python: окна, события, отрисовка, игровой цикл

90 минут
8 заданий
Урок 11 из 11

1 Что такое Pygame?

Pygame — это библиотека для Python, которая позволяет создавать игры и мультимедийные приложения. Она предоставляет инструменты для работы с графикой, звуком, вводом от пользователя и многим другим.

Что можно создать с Pygame?

  • 🎮 2D-игры (платформеры, аркады, головоломки)
  • 🎨 Интерактивные приложения и анимации
  • 🎵 Программы для работы со звуком
  • 🖼️ Простые графические редакторы
hello_pygame.py
# Минимальная программа на Pygame
import pygame

# Инициализация Pygame
pygame.init()

# Создание окна
screen = pygame.display.set_mode((800, 600))

# Заголовок окна
pygame.display.set_caption("Моя первая игра!")

# Игровой цикл
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# Обновление экрана
pygame.display.flip()

pygame.quit()

Разбор программы

pygame.init() — инициализирует все модули Pygame.

pygame.display.set_mode() — создаёт игровое окно указанного размера.

Игровой цикл — бесконечный цикл, который обрабатывает события и обновляет экран.

pygame.quit() — корректно закрывает Pygame при завершении программы.

2 Установка Pygame

Перед началом работы нужно установить библиотеку Pygame. Это делается через пакетный менеджер pip.

Терминал
# Установка Pygame
pip install pygame

# Проверка установки
pip show pygame

Важно!

Если у вас несколько версий Python, используйте:

pip3 install pygame

Или для конкретного Python:

python -m pip install pygame

Совет

После установки проверьте, что Pygame работает:

import pygame
print(pygame.ver)

Если версия вывелась без ошибок — установка успешна!

3 Создание окна

Окно — это основа любой игры. В Pygame окно создаётся функцией pygame.display.set_mode().

window.py
import pygame

pygame.init()

# Размер окна (ширина, высота)
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))

# Заголовок окна
pygame.display.set_caption("Игра на Pygame")

# Иконка окна (опционально)
# icon = pygame.image.load('icon.png')
# pygame.display.set_icon(icon)

running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

screen.fill((0, 0, 0))  # Чёрный фон
pygame.display.flip()

pygame.quit()
RGB

Цвета в Pygame

Цвета задаются кортежем (R, G, B)

(255, 0, 0) # Красный
(0, 255, 0) # Зелёный
(0, 0, 255) # Синий
FPS

Частота кадров

Ограничивает FPS для стабильности

clock = pygame.time.Clock()
clock.tick(60) # 60 FPS

4 Игровой цикл

Игровой цикл (Game Loop) — это сердце любой игры. Он постоянно выполняется и делает три вещи:

  1. Обрабатывает события (нажатия клавиш, движение мыши)
  2. Обновляет состояние игры (позиции объектов, физику)
  3. Отрисовывает кадр (рисует всё на экране)
game_loop.py
import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

running = True
while running:
# 1. Обработка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# 2. Обновление состояния игры
# (здесь будет логика игры)

# 3. Отрисовка
screen.fill((30, 30, 30))  # Очистка экрана
# Здесь будет отрисовка объектов

pygame.display.flip()  # Обновление экрана
clock.tick(60)  # 60 FPS

pygame.quit()

Внимание!

Без clock.tick() цикл будет выполняться максимально быстро, что может перегрузить процессор. Всегда ограничивайте FPS!

5 Отрисовка фигур

Pygame позволяет рисовать простые фигуры: прямоугольники, круги, линии и многоугольники.

drawing.py
import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
running = True

while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

screen.fill((255, 255, 255))  # Белый фон

# Прямоугольник: (поверхность, цвет, (x, y, ширина, высота))
pygame.draw.rect(screen, (255, 0, 0), (100, 100, 50, 50))

# Круг: (поверхность, цвет, (x, y), радиус)
pygame.draw.circle(screen, (0, 255, 0), (300, 300), 40)

# Линия: (поверхность, цвет, (x1, y1), (x2, y2), толщина)
pygame.draw.line(screen, (0, 0, 255), (0, 0), (800, 600), 3)

# Эллипс: (поверхность, цвет, (x, y, ширина, высота))
pygame.draw.ellipse(screen, (255, 255, 0), (500, 200, 100, 60))

pygame.display.flip()

pygame.quit()

Прямоугольник

pygame.draw.rect(surface, color, (x, y, w, h))

Круг

pygame.draw.circle(surface, color, (x, y), radius)

Линия

pygame.draw.line(surface, color, (x1, y1), (x2, y2), width)

Многоугольник

pygame.draw.polygon(surface, color, [(x1,y1), (x2,y2), ...])

6 Обработка событий

События — это действия пользователя: нажатие клавиш, движение мыши, закрытие окна. Все события обрабатываются в игровом цикле через pygame.event.get().

events.py
import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
running = True

while running:
for event in pygame.event.get():
# Закрытие окна
if event.type == pygame.QUIT:
running = False

# Нажатие клавиши
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
if event.key == pygame.K_SPACE:
print("Пробел нажат!")

# Движение мыши
if event.type == pygame.MOUSEMOTION:
x, y = event.pos
print(f"Мышь: ({x}, {y})")

# Клик мыши
if event.type == pygame.MOUSEBUTTONDOWN:
print("Клик мыши!")

screen.fill((0, 0, 0))
pygame.display.flip()

pygame.quit()
Событие Описание
pygame.QUIT Закрытие окна
pygame.KEYDOWN Нажатие клавиши
pygame.KEYUP Отпускание клавиши
pygame.MOUSEMOTION Движение мыши
pygame.MOUSEBUTTONDOWN Нажатие кнопки мыши
pygame.MOUSEBUTTONUP Отпускание кнопки мыши

Совет

Для проверки состояния клавиш в реальном времени используйте:

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    # Движение влево

7 Работа с изображениями

В играх часто используются спрайты — изображения персонажей, объектов и фонов. Pygame позволяет загружать и отображать изображения.

images.py
import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))

# Загрузка изображения
player = pygame.image.load("player.png")

# Изменение размера (опционально)
player = pygame.transform.scale(player, (50, 50))

# Позиция игрока
player_x, player_y = 100, 100

running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

screen.fill((30, 30, 30))

# Отрисовка изображения
screen.blit(player, (player_x, player_y))

pygame.display.flip()

pygame.quit()

Важно!

screen.blit() — метод для отрисовки изображения на поверхности. Первый параметр — изображение, второй — координаты (x, y).

Совет

Для работы с прозрачностью используйте изображения в формате PNG. Формат JPG не поддерживает прозрачный фон.

8 Практика

Отлично! Теперь давай закрепим знания на практике. Реши несколько заданий:

Задание 1 Легко

Создание окна

Создай окно Pygame размером 640×480 с заголовком "Моя игра".

Подсказка

Используй pygame.display.set_mode((640, 480)) и pygame.display.set_caption().

Задание 2 Легко

Отрисовка круга

Нарисуй красный круг радиусом 30 в центре экрана (320, 240).

Подсказка

Используй pygame.draw.circle() с цветом (255, 0, 0).

Задание 3 Средне

Движение квадрата

Создай квадрат, который двигается вправо при нажатии стрелки вправо.

Подсказка

Используй pygame.key.get_pressed() для проверки нажатия клавиш.

Задание 4 Средне

Обработка клика мыши

При клике мыши рисуй круг в месте клика.

Подсказка

Используй событие pygame.MOUSEBUTTONDOWN и event.pos.

Задание 5 Средне

Ограничение движения

Сделай так, чтобы квадрат не выходил за границы экрана.

Подсказка

Проверяй координаты: если x < 0 или x > ширина - размер, не двигай.

Задание 6 Сложно

Прыгающий мяч

Создай мяч, который падает вниз и отскакивает от нижней границы экрана.

Подсказка

Используй переменную скорости по Y. При достижении низа меняй направление.

Задание 7 Сложно

Игра "Ловец"

Создай игру: игрок управляет корзиной, сверху падают предметы. Нужно ловить их корзиной.

Подсказка

Используй прямоугольник для корзины и круг для предмета. Проверяй столкновения.

Задание 8 Сложно

Мини-платформер

Создай простую игру: персонаж может бегать и прыгать по платформам.

Подсказка

Используй гравитацию, проверку столкновений с платформами и управление клавишами.