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

Добавление усилений и коллекций в Pygame

5 min read Game Dev Обновлено 05 Jan 2026
Усиления и коллекции в Pygame
Усиления и коллекции в Pygame

Игрок играет в аркадную игру на ретро-консоли

Power-ups и collectibles существенно улучшают игровой процесс. Добавляя их в проекты на Pygame, вы создаёте новые вызовы, повышаете мотивацию игрока и вводите стратегические решения. Pygame гибок и позволяет реализовать такие механики простыми средствами.

Установка и подготовка

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

pip install pygame

Далее создадим простую игру, где игрок двигается влево/вправо и избегает врага. Код ниже — минимальная рабочая основа. Его можно расширять, добавляя предметы и усиления.

import pygame  
import random  
  
# Initialize Pygame  
pygame.init()  
  
# Set up the game window  
window_width = 800  
window_height = 600  
window = pygame.display.set_mode((window_width, window_height))  
pygame.display.set_caption("My Game")  
  
# Set up player  
player_width = 50  
player_height = 50  
player_x = (window_width - player_width) // 2  
player_y = window_height - player_height - 10  
player_speed = 5  
  
# Set up enemy  
enemy_width = 50  
enemy_height = 50  
enemy_x = random.randint(0, window_width - enemy_width)  
enemy_y = 50  
enemy_speed = 3  
  
# Game loop  
running = True  
while running:  
    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            running = False  
  
    # Player movement  
    keys = pygame.key.get_pressed()  
    if keys[pygame.K_LEFT] and player_x > 0:  
        player_x -= player_speed  
    if keys[pygame.K_RIGHT] and player_x < window_width - player_width:  
        player_x += player_speed  
  
    # Enemy movement  
    enemy_y += enemy_speed  
    if enemy_y > window_height:  
        enemy_x = random.randint(0, window_width - enemy_width)  
        enemy_y = 0  
  
    # Collision detection  
    if (player_x < enemy_x + enemy_width) and \  
        (player_x + player_width > enemy_x) and \  
        (player_y < enemy_y + enemy_height) and \  
        (player_y + player_height > enemy_y):  
        running = False  
  
    # Clear the screen  
    window.fill((0, 0, 0))  
  
    player_pos = (player_x, player_y,   
                  player_width, player_height)  
    enemy_pos =  (enemy_x, enemy_y,   
                  enemy_width, enemy_height)  
  
    # Draw player  
    pygame.draw.rect(window, (255, 255, 255), player_pos)  
  
    # Draw enemy  
    pygame.draw.rect(window, (255, 0, 0), enemy_pos)  
  
    # Update the display  
    pygame.display.update()  
  
# Quit the game  
pygame.quit()

Ниже — визуализация простой сцены с игроком и врагом.

Простая аркадная сцена: игрок и враг

Создание коллекционных предметов (collectibles)

Цель: добавить предмет, который при сборе исчезает и добавляет 10 очков к счёту. Для этого проверяем коллизии между игроком и предметом. Создайте файл collectibles.py и добавьте изменения, показанные ниже.

# Set up collectible  
collectible_width = 30  
collectible_height = 30  
collectible_x = random.randint(0, window_width - collectible_width)  
collectible_y = 50  
  
# Set up score  
score = 0  
font = pygame.font.Font(None, 36)  
  
# ...  
  
# Collision detection with collectible  
if (player_x < collectible_x + collectible_width) and \  
                        (player_x + player_width > collectible_x) and \  
                        (player_y < collectible_y + collectible_height) and \  
                        (player_y + player_height > collectible_y):  
        collectible_x = random.randint(0, window_width - collectible_width)  
        collectible_y = 50  
        score += 10  
# ...  
  
collectible_pos = (collectible_x, collectible_y)  
# Draw collectible  
pygame.draw.circle(window, (0, 255, 0), collectible_pos, collectible_width)  
  
# Draw score  
score_text = font.render("Score: " + str(score), True, (255, 255, 255))  
window.blit(score_text, (10, 10))

Результат: игрок, враг и коллекционный предмет.

Сцена Pygame: игрок, враг и коллекционный объект

Заметки по реализации коллекций:

  • Радиус/форма предмета влияет на ощущение «попадания» при коллизии. Круги проще проверять с помощью расcтояния, прямоугольники — через AABB.
  • Если нужно несколько предметов одновременно, храните их в списке и обрабатывайте в цикле.

Создание усилений (power-ups)

Логика: при сборе усиление временно меняет поведение игры (например, уничтожение врага при столкновении). Пример кода для powerups.py:

# Set up power-up  
powerup_width = 40  
powerup_height = 40  
powerup_x = random.randint(0, window_width - powerup_width)  
powerup_y = 50  
shield_active = False  
shield_timer = 0  
  
# ...  
  
# Collision detection with power-up  
collision_powerup = (player_x < powerup_x + powerup_width) and \  
                    (player_x + player_width > powerup_x) and \  
                    (player_y < powerup_y + powerup_height) and \  
                    (player_y + player_height > powerup_y)  
  
if collision_powerup:  
    powerup_x = random.randint(0, window_width - powerup_width)  
    powerup_y = 50  
    shield_active = True  
    shield_timer = pygame.time.get_ticks()  
  
# ...  
  
# Check shield timer  
if shield_active:  
    current_time = pygame.time.get_ticks()  
    if current_time - shield_timer > 5000:    
        shield_active = False  
  
# ...  
  
# Define the vertices of the triangle  
x1 = powerup_x + powerup_width / 2  
y1 = powerup_y  
x2 = powerup_x  
y2 = powerup_y + powerup_height  
x3 = powerup_x + powerup_width  
y3 = powerup_y + powerup_height  
  
# Draw the triangle  
pygame.draw.polygon(window, (255, 255, 0), [(x1, y1), (x2, y2), (x3, y3)])  
  
# ...  
  
# Collision detection with shield active  
collision_shield = shield_active and \  
                   (player_x < enemy_x + enemy_width) and \  
                   (player_x + player_width > enemy_x) and \  
                   (player_y < enemy_y + enemy_height) and \  
                   (player_y + player_height > enemy_y)  
  
if collision_shield:  
    enemy_x = random.randint(0, window_width - enemy_width)  
    enemy_y = 0  

Визуализация усиления и логика его действия важны для понимания игроком эффектов. В примере усиление представлено треугольником и действует 5 секунд.

Сцена Pygame: игрок, враг, усиление и коллекционный объект

Таймеры для усилений

Чтобы усиление исчезало и респавнилось через заданный промежуток, используйте таймеры. Пример кода в файле timer.py:

# Set up timer for power-up respawn  
powerup_respawn_timer = 0  
  
# Check power-up timer  
if not shield_active:  
    current_time = pygame.time.get_ticks()  
    if current_time - powerup_respawn_timer > 3000:    
        powerup_x = random.randint(0, window_width - powerup_width)  
        powerup_y = 50  
        powerup_respawn_timer = pygame.time.get_ticks()  
  

Визуализация оставшегося времени усиления

Покажите игроку оставшееся время эффектов. Пример простого индикатора в bar.py:

# Set up power-up bar  
bar_width = 100  
bar_height = 10  
bar_x = window_width - bar_width - 10  
bar_y = 10  
  
# ...  
  
# Calculate power-up timer progress  
if shield_active:  
   current_time = pygame.time.get_ticks()  
   elapsed_time = current_time - shield_timer  
   timer_progress = (5000 - elapsed_time) / 5000  
   # Draw power-up bar  
   bar_rect = pygame.Rect(bar_x, bar_y, bar_width * timer_progress, bar_height)  
   pygame.draw.rect(window, (0, 255, 255), bar_rect)

Индикатор таймера усиления: игрок, враг и предметы

Лучшие практики при добавлении усилений и коллекций

Визуальная различимость

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

Баланс и сложность

Регулируйте частоту появления и длительность эффектов. Слишком много усилений делает игру лёгкой, слишком мало — скучной. Тестируйте и корректируйте параметры по фидбеку.

Обратная связь и награды

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

Таймеры и длительность

Ограничивайте длительность усилений. Это поддерживает баланс и заставляет игроков принимать решения. 3–10 секунд часто дают хороший старт, но подгоняйте по механике игры.

Тестирование и итерация

Плейтестируйте разные конфигурации. Записывайте наблюдения и изменяйте частоту спавна, силу и длительность эффектов до удовлетворительного результата.

Когда система усилений и коллекций может не подойти

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

Важно: выбирайте механику под жанр и целевую аудиторию.

Альтернативные подходы

  • Компонентная система: храните состояние усилений в компонентах сущностей (Entity-Component-System). Подходит для крупных проектов.
  • Скриптовые эффекты: храните таймеры и эффекты в скриптах уровней, а не в основном цикле. Это упрощает баланс и модульность.
  • Менеджер предметов: отдельный менеджер контролирует спавн, пул объектов и респавн, что уменьшает фрагментацию кода.

Ментальные модели и эвристики

  • Правило 3: максимум 3 активных усиления у игрока одновременно — проще балансировать.
  • Видимость прежде взаимодействия: предмет должен быть виден за 1–2 секунды до того, как игрок до него доберётся.
  • Цена vs. Частота: редкие усиления должны быть мощнее по эффекту.

Мини-методология внедрения (шаги)

  1. Внедрите простой объект на сцену и сделайте базовую коллизию.
  2. Добавьте счётчик/нагрузку (очки, жизни).
  3. Реализуйте визуальную подсказку (цвет, форма, звук).
  4. Введите таймеры для длительности и респавна.
  5. Протестируйте и отрегулируйте частоту и длительность.

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

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

Ролевые чеклисты (разработчик / тестировщик / дизайнер)

Разработчик:

  • Реализовал коллизии и логику спавна.
  • Добавил защищённый респавн и таймеры.
  • Оптимизировал отрисовку для множества предметов.

Тестировщик:

  • Проверил сбор предметов в разных местах сцены.
  • Провёл стресс-тест с большим количеством объектов.
  • Подтвердил корректность счёта и длительности эффектов.

Дизайнер:

  • Утвердил визуальную палитру и иконки.
  • Задал желаемую частоту и мощность эффектов.
  • Оценил влияние на кривую сложности.

Факт-бокс: ключевые параметры (ориентиры)

  • Частота респавна предметов: 1–5 секунд (игра-аркада).
  • Длительность усилений: 3–10 секунд.
  • Стоимость коллекционного предмета: обычно 5–50 очков в зависимости от темпа набора очков.
  • Максимум активных усилений: 1–3 одновременно.

Эти числа — отправная точка. Настраивайте под конкретную механику.

Тестовые сценарии и критерии приёмки

  1. Сбор коллекции увеличивает счёт на 10 и предмет респавнится в пределах экрана.
  2. Сбор усиления активирует щит, а при столкновении с врагом враг уничтожается.
  3. Щит автоматически деактивируется через заданный интервал.
  4. Индикатор времени уменьшает ширину полосы от полной до нулевой в течение времени действия усиления.

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

  • Коллекционный предмет: предмет, который можно подобрать и получить награду.
  • Усиление: временный эффект, изменяющий правила игры.
  • Респавн: появление объекта заново после исчезновения.

Советы по оптимизации и масштабированию

  • Используйте пулы объектов (object pools) для частого создания/удаления предметов.
  • Собирайте статистику спавнов и сборов во время тестов. Это поможет принимать решения по балансу.
  • Разделяйте логику отрисовки и игровой логики — это упростит тестирование.

Заключение

Добавление усилений и коллекций в Pygame — быстрый способ обогатить геймплей. Начните с простых объектов и коллизий, затем добавьте таймеры и визуальные индикаторы. Тестируйте и корректируйте частоту и длительность эффектов для достижения нужного баланса. Малые изменения в параметрах часто сильно влияют на ощущение игры, поэтому итеративная настройка критична.

Важно: адаптируйте механику под жанр и целевую аудиторию. В небольших прототипах используйте простые структуры данных; в больших проектах — менеджеры и компонентные системы.

Резюме:

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

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство