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

Система здоровья в Arcade (Python)

5 min read Game Dev Обновлено 20 Dec 2025
Система здоровья в Arcade (Python)
Система здоровья в Arcade (Python)

Экран с надписью Game Over

Добавление системы здоровья в вашу аркадную игру повышает вовлечённость игрока и даёт дополнительные возможности для баланса и геймплейных решений. В статье разберём по шагам, как реализовать базовую систему здоровья в Arcade, какие есть варианты расширения, и как протестировать поведение при разных сценариях.

Введение

Определение: система здоровья — это набор переменных и правил, которые отслеживают текущее здоровье игрока, рассчитывают урон и восстановление, а также сигнализируют о смерти или проигрыше. В примерах используется максимальное здоровье 100, но это значение легко изменить.

Кому полезно: разработчикам инди-игр, студентам, изучающим Arcade, и тех, кто хочет быстро добавить визуальную панель здоровья и механику урона.

Создание простой игры

Начнём с минимальной сцены: окно с игроком и врагом. Убедитесь, что Python и pip установлены, затем установите Arcade:

pip install arcade

Создайте файл simple-game.py и добавьте базовый код игры. Ниже — сокращённый и исправленный пример с управлением клавишами и двумя спрайтами:

import arcade

# Параметры окна
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# Скорость движения игрока
PLAYER_MOVEMENT_SPEED = 5

class GameWindow(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)

        # Создаём игрока и врага как круги
        self.player = arcade.SpriteCircle(30, arcade.color.BLUE)
        self.enemy = arcade.SpriteCircle(30, arcade.color.RED)
        self.player.center_x = 100
        self.player.center_y = 100
        self.enemy.center_x = 400
        self.enemy.center_y = 300

    def on_draw(self):
        arcade.start_render()
        self.player.draw()
        self.enemy.draw()

    def update(self, delta_time):
        pass

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player.center_x -= PLAYER_MOVEMENT_SPEED
        elif key == arcade.key.RIGHT:
            self.player.center_x += PLAYER_MOVEMENT_SPEED
        elif key == arcade.key.UP:
            self.player.center_y += PLAYER_MOVEMENT_SPEED
        elif key == arcade.key.DOWN:
            self.player.center_y -= PLAYER_MOVEMENT_SPEED

def main():
    game = GameWindow(SCREEN_WIDTH, SCREEN_HEIGHT)
    arcade.run()

if __name__ == "__main__":
    main()

Запустив код, вы увидите окно с двумя кругами: синим (игрок) и красным (враг).

Простой аркадный пример с игроком и врагом

Определение переменных и констант для здоровья

Добавьте в класс GameWindow переменные, которые будут хранить текущее здоровье игрока, скорость восстановления и внутренний таймер лечения. Это позволяет отделить логику здоровья от остальной механики:

class GameWindow(arcade.Window):
    def __init__(self, width, height):
        # ... остальной код и инициализация

        # Значения здоровья
        self.player_health = 100  # текущее здоровье игрока
        self.max_health = 100     # максимальное здоровье

        # Восстановление: единиц здоровья в секунду
        self.heal_rate = 1

        # Таймер для накопительного лечения
        self.heal_timer = 0.0

Важно: используйте self.max_health, чтобы в дальнейшем безопасно ограничивать верхний порог.

Механики урона и лечения

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

class GameWindow(arcade.Window):
    def __init__(self, width, height):
        # ...
        self.damage_cooldown = 0.5  # сек между применениями урона
        self.damage_timer = 0.0

    def update(self, delta_time):
        # Обновляем таймеры
        self.heal_timer += delta_time
        self.damage_timer += delta_time

        # Если игрок и враг пересекаются и кулдаун урона истёк
        if arcade.check_for_collision(self.player, self.enemy):
            if self.damage_timer >= self.damage_cooldown:
                self.player_health -= 5
                self.damage_timer = 0.0
        else:
            # Вне столкновения лечим каждые 2 секунды
            if self.heal_timer >= 2.0:
                self.player_health += self.heal_rate
                self.heal_timer = 0.0

        # Ограничиваем диапазон здоровья
        if self.player_health > self.max_health:
            self.player_health = self.max_health
        if self.player_health < 0:
            self.player_health = 0

Пояснение: damage_cooldown предотвращает мгновенное снятие большого количества здоровья при непрерывном столкновении. heal_timer аккумулирует прошедшее время и применяет лечение каждые 2 секунды.

Управление смертью игрока и сценариями Game Over

Когда здоровье достигает нуля, нужно корректно обработать конец игры — показать экран «проигрыша», остановить игровые процессы и предоставить опции (рестарт, выход). В простом примере можно просто закрыть окно:

if self.player_health <= 0:
    # Здесь можно показывать экран Game Over, а не сразу закрывать окно
    arcade.close_window()

Рекомендация: вместо мгновенного закрытия добавьте состояние игры (например, self.game_over = True) и отдельную логику отрисовки экрана с кнопками.

Визуализация панели здоровья

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

def on_draw(self):
    arcade.start_render()
    self.player.draw()
    self.enemy.draw()

    gray = arcade.color.LIGHT_GRAY
    green = arcade.color.GREEN

    # Фон панели здоровья
    arcade.draw_rectangle_filled(SCREEN_WIDTH // 2, 20, SCREEN_WIDTH, 20, gray)

    # Текущая ширина панели по проценту здоровья
    health_width = (self.player_health / self.max_health) * SCREEN_WIDTH

    # Центр зелёной заливки сдвинут влево так, чтобы заполнение росло слева направо
    arcade.draw_rectangle_filled(health_width // 2, 20, health_width, 20, green)

Простая аркада: игрок, враг и панель здоровья

Числовое отображение здоровья

Для точного контроля можно дополнительно показывать число здоровья:

# Внутри on_draw()
black = arcade.color.BLACK
text = f"Здоровье: {int(self.player_health)} / {self.max_health}"
arcade.draw_text(text, 10, 40, black, 14)

Это полезно в играх с экипировкой, бафами и постепенным лечением.

Дополнительные функции и расширения

Ниже — список практических улучшений и примеры реализации.

Энергетические (здоровые) бонусы

Создайте объект power_up, который при столкновении даёт здоровье и удаляется:

# В update()
if hasattr(self, 'power_up') and arcade.check_for_collision(self.player, self.power_up):
    self.player_health += 20
    if self.player_health > self.max_health:
        self.player_health = self.max_health
    self.power_up.kill()

Разные типы врагов

Добавьте свойство type у врага, чтобы варьировать наносимый урон:

# Пример в update()
if arcade.check_for_collision(self.player, self.enemy):
    if getattr(self.enemy, 'type', 'weak') == 'weak':
        self.player_health -= 5
    elif self.enemy.type == 'strong':
        self.player_health -= 20

Интервалы и устойчивость

Если урон должен начисляться непрерывно (например, при нахождении в огне), применяйте модель урона за секунду: урон_rate * delta_time.

# Урон за секунду
damage_per_second = 10
if in_hazard_zone:
    self.player_health -= damage_per_second * delta_time

Это даёт более предсказуемое поведение при разных частотах обновления.

Практическая методология внедрения (мини-метод)

  1. Спланировать: выбрать max_health, heal_rate, damage_amount и частоту обновления.
  2. Изолировать: реализовать систему здоровья в отдельном классе или модуле.
  3. Интегрировать: подключить к игровому циклу и снабдить API (apply_damage, heal, is_dead).
  4. Визуализировать: добавить панель, числа и звуковые сигналы.
  5. Тестировать: функциональные и граничные сценарии (см. тесты ниже).

Чек-листы по ролям

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

  • Отделить логику здоровья в модуль/класс.
  • Реализовать защиту от переполнения/отрицательных значений.
  • Добавить единый интерфейс (apply_damage, apply_heal, get_health_pct).

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

  • Проверить, что здоровье не уходит ниже 0 и не превышает max.
  • Проверить кулдаун урона и корректность лечения по таймеру.
  • Тестировать рестарты и сохранение/загрузку.

Дизайнер (геймдиз):

  • Подобрать численные значения (max_health, heal_rate, damage) для баланса.
  • Определить фидбек игроку (звук, вспышки, вибрация).

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

  • Игрок получает урон при столкновении и только с учётом установленных кулдаунов.
  • Вне столкновения здоровье восстанавливается каждые 2 секунды на heal_rate.
  • Панель здоровья корректно отображает текущее значение и процент.
  • При достижении 0 здоровья игра переходит в состояние Game Over (необязательно немедленно закрывается).

Тестовые сценарии (acceptance)

  1. Столкновение с одним ‘weak’ врагом: здоровье снижается на 5 при первом столкновении и затем через кулдаун.
  2. Длительное пребывание в зоне урона: здоровье уменьшается плавно пропорционально delta_time.
  3. Сбор аптечки: здоровье увеличивается на 20, но не превышает max_health.
  4. Быстрые многократные столкновения: не должно происходить мгновенное снятие сотен единиц (работает кулдаун).

Когда такая система не подходит (контрпримеры)

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

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

  • Не храните логику здоровья прямо в основном игровом цикле; выделите класс HealthComponent.
  • Для большого числа объектов используйте батчевые операции и минимизируйте проверку коллизий (пространственные индексы).
  • При сетевой игре синхронизируйте только ключевые события (apply_damage, death), а не каждое изменение HP.

Глоссарий (одно предложение)

  • heal_rate: скорость восстановления здоровья в единицах в секунду.
  • damage_cooldown: минимальный интервал между применениями урона от одного источника.
  • max_health: максимальное значение здоровья для персонажа.

Короткое резюме

Добавление системы здоровья — простой, но мощный инструмент для улучшения геймплея. Начните с базовой модели (урон, исцеление, панель) и затем расширяйте систему через типы врагов, бафы и более тонкий контроль времени. Отдельный модуль здоровья и тщательное тестирование помогут избежать многих ошибок.

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Как исправить ошибку «Неопознанная сеть» в Windows
Сеть

Как исправить ошибку «Неопознанная сеть» в Windows

Устранение конфликта IP-адресов в Windows
Сеть

Устранение конфликта IP-адресов в Windows

ERR_NETWORK_CHANGED в Chromium на Linux — быстрый обход
Linux

ERR_NETWORK_CHANGED в Chromium на Linux — быстрый обход

Локальный сервер Minecraft PE: установка и плагины
Игры

Локальный сервер Minecraft PE: установка и плагины

Вложенная таблица в Word: как вставить и настроить
Microsoft Word

Вложенная таблица в Word: как вставить и настроить

Заменить Network Utility через Terminal в macOS
macOS

Заменить Network Utility через Terminal в macOS