Гид по технологиям

Создание уровней в PyGame: план, связь и обмен данными

4 min read Разработка игр Обновлено 21 Nov 2025
Уровни в PyGame: создание и связь
Уровни в PyGame: создание и связь

двое разработчиков планируют структуру уровней на белой доске

Определение: уровень — это отдельная игровая сцена с собственными объектами, правилами и условиями завершения.

Планирование и проектирование уровней

Планирование уровней — обязательный этап. Хорошая проработка уровней позволяет сбалансировать сложность, направлять игрока и поддерживать ритм игры.

Ключевые вопросы при планировании:

  • Что умеет игрок? (движение, прыжок, атака, взаимодействие)
  • Какие препятствия и враги нужны для создания интереса?
  • Как игрок будет переходить между уровнями?
  • Какие данные должны сохраняться между уровнями (очки, здоровье, позиция)?

Пример для платформера: продумайте размещение платформ, расстояния для прыжков, места появления врагов и точки возрождения. Начинайте с бумажного эскиза, затем реализуйте прототипы.

Важно: небольшие итерации ускоряют балансировку. Сначала сделайте «играбельный» уровень, затем добавляйте детали.

Установка зависимостей

Убедитесь, что у вас установлен pip. Установите PyGame командой:

pip install pygame

Создание двух простых уровней

Ниже — минимальный пример уровня с платформой и игроком. Код написан для понимания идеи; в реальном проекте лучше организовать классы и модули.

Первый уровень (level1.py):

import pygame

pygame.init()

# Константы
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLATFORM_WIDTH = 100
PLATFORM_HEIGHT = 20
PLAYER_WIDTH = 50
PLAYER_HEIGHT = 50
PLATFORM_COLOR = (255, 255, 255)
PLAYER_COLOR = (255, 0, 0)

# Создать окно
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

# Платформа и игрок
platform = pygame.Rect(350, 500, PLATFORM_WIDTH, PLATFORM_HEIGHT)
player = pygame.Rect(375, 450, PLAYER_WIDTH, PLAYER_HEIGHT)

# Игровой цикл
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.move_ip(-10, 0)
            elif event.key == pygame.K_RIGHT:
                player.move_ip(10, 0)

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, PLATFORM_COLOR, platform)
    pygame.draw.rect(screen, PLAYER_COLOR, player)
    pygame.display.flip()

pygame.quit()

Второй уровень отличается позицией и размером платформы. Сохраните как level2.py:

import pygame

pygame.init()

# Константы
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLATFORM_WIDTH = 150
PLATFORM_HEIGHT = 20
PLAYER_WIDTH = 50
PLAYER_HEIGHT = 50
PLATFORM_COLOR = (255, 255, 255)
PLAYER_COLOR = (255, 0, 0)

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

platform = pygame.Rect(200, 500, PLATFORM_WIDTH, PLATFORM_HEIGHT)
player = pygame.Rect(225, 450, PLAYER_WIDTH, PLAYER_HEIGHT)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.move_ip(-10, 0)
            elif event.key == pygame.K_RIGHT:
                player.move_ip(10, 0)

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, PLATFORM_COLOR, platform)
    pygame.draw.rect(screen, PLAYER_COLOR, player)
    pygame.display.flip()

pygame.quit()

Эти примеры демонстрируют идею: структура уровней повторяющаяся, меняются только параметры сцены.

Подключение разных уровней

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

current_level = 1

# Предполагается, что platform1 и platform2 уже определены как pygame.Rect
if current_level == 1:
    pygame.draw.rect(screen, PLATFORM_COLOR, platform1)
    pygame.draw.rect(screen, PLAYER_COLOR, player)
    # Пример простого условия: если игрок ушёл с платформы вниз — переключаемся
    if not player.colliderect(platform1):
        current_level = 2
elif current_level == 2:
    pygame.draw.rect(screen, PLATFORM_COLOR, platform2)
    pygame.draw.rect(screen, PLAYER_COLOR, player)
    # Условие завершения второго уровня
    if player.colliderect(platform2):
        running = False

Советы:

  • Используйте явные функции load_level(n) для инициализации объектов уровня.
  • Храните объекты уровня в структуре (словарь или список), чтобы избегать множественных if/elif.
  • Для сложных переходов применяйте состояния (state machine).

Обмен данными между уровнями

Чтобы уровни могли разделять состояние (позиция игрока, здоровье, очки), вынесите общие данные в отдельный модуль game_data.py.

game_data.py:

player_pos = (0, 0)
score = 0
lives = 3

В каждом уровне импортируйте game_data и используйте данные при создании объектов:

import pygame
import game_data

# Используем позицию из game_data
player = pygame.Rect(game_data.player_pos[0], game_data.player_pos[1], PLAYER_WIDTH, PLAYER_HEIGHT)

# В игровом цикле обновляем позицию
# ... движение игрока ...
# После перемещения:
game_data.player_pos = (player.x, player.y)

Рекомендации по организации общего состояния:

  • Храните только ту информацию, которая действительно нужна между уровнями.
  • Для сложных игр используйте объект GameState с методами сериализации (save/load).
  • Избегайте глобальных мутаций без контроля — применяйте функции-обёртки для изменения состояния.

Лучшие практики и альтернативные подходы

Альтернатива модулю с глобальными переменными — использовать менеджер сцен (SceneManager) или шаблон State. SceneManager предоставляет API смены сцен, передачи аргументов и безопасной инициализации.

Ментальная модель: каждый уровень — это независимый «контейнер» с входом (initial state), циклом и выходом (conditions). Менеджер отвечает за маршрутизацию между контейнерами.

Когда предложенный подход может не подойти:

  • Проект масштабируется до десятков сцен с общим сложным состоянием — лучше использовать объектную модель и шаблоны.
  • Нужна сетевaя синхронизация — глобальные переменные не подходят.

Мини-методология для разработки уровней:

  1. Прототипирование: создайте грубую версию уровня.
  2. Тестирование: проверьте проходимость и сложность.
  3. Балансировка: подправьте расстояния, скорости и позиции врагов.
  4. Полировка: добавить эффекты, звуки, визуальные подсказки.

Роли и чек-лист (для небольшой команды):

  • Дизайнер: схема уровня, точки интереса, сложность.
  • Разработчик: реализация сцен, переключение, сохранение состояния.
  • Тестер: сценарии прохода, проверка багов, регресс-тесты.

Чек-лист перед релизом уровня:

  • Уровень проходим без багов.
  • Переходы между уровнями корректны.
  • Состояние игрока корректно сохраняется и восстанавливается.
  • Нет «проваливаний» за пределы сцены.

Критерии приёмки

  • Игрок может пройти уровень от старта до финиша без непроходимых участков.
  • Все предметы состояния (очки, жизни, позиция) корректно сохраняются между уровнями.
  • Переключение уровней не вызывает утечек памяти или зависаний.

Короткий глоссарий

  • PyGame — библиотека Python для разработки 2D-игр.
  • Rect — структура в PyGame для описания прямоугольника (позиция + размер).
  • colliderect — метод Rect для проверки пересечения двух прямоугольников.

Нюансы и возможные улучшения

  • Сохранение прогресса: для долгих игр используйте сериализацию состояния в файл JSON.
  • Управление ресурсами: грузите текстуры и звуки по требованию, чтобы экономить память.
  • Тесты: автоматизируйте базовые приёмочные сценарии для уровней.

Важно: для небольших учебных проектов модуль game_data.py вполне приемлем. Для коммерческих проектов переходите к объектной архитектуре.

Итог

Уровни организуют игровой процесс и усиливают вовлечённость игрока. Начните с простых, проходите итерации, и постепенно усложняйте архитектуру: от отдельных скриптов — к менеджерам сцен и сериализуемому состоянию. Это уменьшит технический долг и ускорит разработку новых уровней.

Заметки:

  • В примерах использованы упрощённые условия столкновений и перемещения. Для реалистичной физики добавьте проверки гравитации и коллизий с уступами.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Не удалось инициализировать Direct3D — решения
Техподдержка

Не удалось инициализировать Direct3D — решения

Исправить Data Retrieval в Diablo 4 на Steam
Игры

Исправить Data Retrieval в Diablo 4 на Steam

Open Graph в WordPress — настройка мета‑тегов
WordPress SEO

Open Graph в WordPress — настройка мета‑тегов

getconf: адаптивные скрипты для разных Linux
Linux

getconf: адаптивные скрипты для разных Linux

Проверка входов в Windows — успешные и неудачные попытки
Безопасность Windows

Проверка входов в Windows — успешные и неудачные попытки

Исправить ошибку DistributedCOM (DCOM) в Windows
Windows

Исправить ошибку DistributedCOM (DCOM) в Windows