Представьте: вы пишете код, запускаете скрипт — и на экране оживает ваш собственный игровой мир. Создание игр на Python с библиотекой PyGame — это увлекательный путь в геймдев, доступный даже новичкам. В этой статье мы пройдём все этапы: от установки инструментов до создания простой, но полностью рабочей игры с графикой, управлением и логикой.
Почему именно Python и PyGame?
Python славится простым и понятным синтаксисом, что делает его идеальным языком для начинающих. А PyGame — это свободная библиотека, специально созданная для разработки игр и мультимедийных приложений. Она берёт на себя всю сложную работу с графикой, звуком и обработкой событий, позволяя вам сосредоточиться на творчестве и игровой механике.
PyGame построена на основе библиотеки SDL (Simple DirectMedia Layer). Это означает, что ваша игра потенциально может быть запущена на множестве платформ, включая Windows, macOS, Linux и даже некоторые мобильные системы.
Подготовка рабочего окружения
Первым делом нужно установить Python (версии 3.7 или новее) и саму библиотеку PyGame. Всё делается в несколько команд.
- Убедитесь, что Python установлен, открыв терминал или командную строку и введя
python --version. - Установите PyGame с помощью менеджера пакетов pip:
pip install pygame - Создайте новую папку для вашего проекта и откройте её в любимом редакторе кода (VS Code, PyCharm).
Скелет игры: основной цикл
Сердце любой игры на PyGame — это главный цикл (game loop). В нём непрерывно происходят три ключевых события: обработка ввода пользователя, обновление состояния игры и отрисовка кадра.
Код минимального приложения
Создайте файл main.py и напишите следующий код:
import pygame
import sys
# Инициализация PyGame
pygame.init()
# Настройки экрана
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(\"Моя первая игра\")
# Цвета (RGB)
BACKGROUND = (30, 30, 50)
# Главный цикл игры
running = True
while running:
# 1. Обработка событий (ввода)
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
# 2. Обновление игровой логики (пока пусто)
# 3. Отрисовка
screen.fill(BACKGROUND)
pygame.display.flip()
# Завершение работы
pygame.quit()
sys.exit()
Запустите этот код. Вы увидите тёмное окно, которое закрывается по крестику или клавише ESC. Это фундамент, на котором мы будем строить.
Добавляем игровые объекты и управление
Давайте создадим простого управляемого персонажа — квадрат (плейера). Мы будем обрабатывать нажатия клавиш-стрелок для его перемещения.
# Добавьте после настройки экрана
player_size = 50
player_x = WIDTH // 2 - player_size // 2
player_y = HEIGHT // 2 - player_size // 2
player_speed = 5
player_color = (0, 200, 100)
# Внутри главного цикла, в блоке обработки событий, добавьте:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_x -= player_speed
if keys[pygame.K_RIGHT]:
player_x += player_speed
if keys[pygame.K_UP]:
player_y -= player_speed
if keys[pygame.K_DOWN]:
player_y += player_speed
# В блоке отрисовки, после screen.fill(...), добавьте:
pygame.draw.rect(screen, player_color, (player_x, player_y, player_size, player_size))
Использование pygame.key.get_pressed() для плавного перемещения предпочтительнее обработки отдельных событий KEYDOWN при управлении персонажем. Это даёт более отзывчивый геймплей.
Враги, столкновения и игровая логика
Игра без цели — просто демо. Добавим врагов (падающие блоки) и простую механику: игрок должен их избегать.
# Глобальные переменные для врагов
import random
enemies = []
enemy_size = 30
enemy_speed = 3
enemy_color = (220, 60, 60)
spawn_timer = 0
# Функция создания врага
def spawn_enemy():
x = random.randint(0, WIDTH - enemy_size)
y = -enemy_size
enemies.append([x, y])
# Функция проверки столкновений
def check_collision(rect1, rect2):
return (rect1[0] < rect2[0] + enemy_size and
rect1[0] + player_size > rect2[0] and
rect1[1] < rect2[1] + enemy_size and
rect1[1] + player_size > rect2[1])
# Внутри главного цикла, в блоке обновления логики:
# Спавн врагов
spawn_timer += 1
if spawn_timer > 60: # Каждую секунду (при 60 FPS)
spawn_enemy()
spawn_timer = 0
# Движение врагов и проверка столкновений
for enemy in enemies[:]:
enemy[1] += enemy_speed
if check_collision((player_x, player_y), enemy):
print(\"Игра окончена!\")
running = False
if enemy[1] > HEIGHT:
enemies.remove(enemy)
# В блоке отрисовки, после отрисовки игрока:
for enemy in enemies:
pygame.draw.rect(screen, enemy_color, (enemy[0], enemy[1], enemy_size, enemy_size))
Полировка: счёт, шрифты и звуки
Чтобы игра выглядела законченной, добавим счёт за уклонение от врагов и простой интерфейс.
# Инициализация шрифта
try:
font = pygame.font.Font(None, 36) # Используем системный шрифт
except:
font = pygame.font.SysFont('arial', 36)
score = 0
# В блоке обновления логики, когда враг уходит за экран:
# if enemy[1] > HEIGHT:
# enemies.remove(enemy)
# score += 10 # Добавьте эту строку
# В блоке отрисовки, в самом конце:
score_text = font.render(f'Счёт: {score}', True, (255, 255, 255))
screen.blit(score_text, (10, 10))
Для добавления звуков используйте pygame.mixer.Sound('sound.wav').play() при событиях (столкновение, набор очков).
Следующие шаги и идеи для развития
- Графика: Замените простые прямоугольники на спрайты с помощью
pygame.image.load(). - Анимация: Реализуйте смену кадров спрайта для оживления персонажа.
- Состояния игры: Добавьте меню, экран паузы и Game Over.
- Физика: Поэкспериментируйте с векторами скорости, ускорением и прыжками.
- Упаковка: С помощью инструментов вроде PyInstaller соберите ваш проект в исполняемый .exe файл, чтобы поделиться с друзьями.
Главное — не бояться экспериментировать. Разбирайте чужие игры из открытых источников, задавайте вопросы на форумах и постоянно добавляйте что-то новое в свой проект.
FAQ: Часто задаваемые вопросы
Сложно ли сделать игру на PyGame новичку?
Нет, это один из лучших способов начать. Python имеет простой синтаксис, а PyGame предоставляет готовые инструменты для работы с графикой. Ваша первая игра может быть создана за несколько часов.
Можно ли создать коммерческую игру на PyGame?
Да, можно. Хотя для сложных 3D-проектов лучше подходят другие движки (Godot, Unity), PyGame отлично справляется с 2D-играми. Известные примеры — «Frets on Fire» и «Dangerous High School Girls in Trouble!».
Что делать, если игра работает медленно?
Оптимизируйте код: используйте pygame.sprite.Group для спрайтов, загружайте изображения и звуки один раз, а не в цикле, и уменьшайте количество объектов на экране. Также убедитесь, что используете clock.tick(60) для контроля FPS.
Где найти ресурсы (графика, звуки) для игры?
Есть множество бесплатных ресурсов с лицензией CC0 или аналогичной: OpenGameArt.org (графика и звуки), Kenney.nl (ассеты), Freesound.org (звуки). Всегда проверяйте условия лицензии.
PyGame или другой движок (Godot, Unity)?
PyGame — отличный выбор для обучения программированию игр «с нуля» и создания простых 2D-проектов. Godot или Unity имеют больше встроенных инструментов (редакторы, физика) и лучше подходят для сложных или коммерческих игр, особенно 3D.