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

Добавление усилений и коллекций в 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
Автор
Редакция

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

Мошенничество AI‑голосом против Gmail
Кибербезопасность

Мошенничество AI‑голосом против Gmail

Как настроить «Не беспокоить» на iPhone
iPhone

Как настроить «Не беспокоить» на iPhone

Управление проектами Unity через Unity Hub
Разработка игр

Управление проектами Unity через Unity Hub

Firefox OS: запуск приложений на Android
Мобильные

Firefox OS: запуск приложений на Android

Как включить аудиоописание на Peacock
Инструкции

Как включить аудиоописание на Peacock

Оптимизация SSD: AHCI, TRIM, прошивка
SSD

Оптимизация SSD: AHCI, TRIM, прошивка