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

Arcade: меню и GUI в играх на Python

5 min read Разработка игр Обновлено 25 Nov 2025
Arcade: меню и GUI в играх на Python
Arcade: меню и GUI в играх на Python

Человек проектирует игровой интерфейс на бумаге

UI (пользовательский интерфейс) и игровые меню укрепляют взаимодействие игрока с игрой. Библиотека Arcade для Python содержит удобные GUI-инструменты, которые упрощают создание меню, окон и диалогов.

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

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

pip install arcade

Ниже — минимальный пример игры с игроком, который может перемещаться влево и вправо, и врагом, двигающимся вправо. Код доступен в репозитории на GitHub и распространяется под лицензией MIT.

import arcade

WIDTH = 800
HEIGHT = 600
PLAYER_SPEED = 25

class Game(arcade.Window):
    def __init__(self):
        super().__init__(WIDTH, HEIGHT, "Simple Game")
        self.player_x = WIDTH // 2
        self.enemy_x = WIDTH - 50
        self.game_over = False

    def setup(self):
        arcade.set_background_color(arcade.color.WHITE)

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, HEIGHT // 2, 20, arcade.color.BLUE)
        arcade.draw_circle_filled(self.enemy_x, HEIGHT // 2, 20, arcade.color.RED)

    def update(self, delta_time):
        self.enemy_x += 0.5
        if self.enemy_x >= WIDTH:
            self.game_over = True

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= PLAYER_SPEED
        elif key == arcade.key.RIGHT:
            self.player_x += PLAYER_SPEED

if __name__ == "__main__":
    game = Game()
    game.setup()
    arcade.run()

Важно: этот пример максимально прост. В настоящем проекте храните состояние игры отдельно от окна и выделяйте логику движения в отдельные методы.

Добавление экрана конца игры

Чтобы показывать экран «Game Over», используйте UIManager и UIMessageBox из arcade.gui. UIManager управляет всеми виджетами, а UIMessageBox позволяет быстро показать окно с текстом и (опционально) кнопками.

Создаём файл game-over.py с обновлённой логикой:

import arcade
from arcade.gui import UIManager, UIMessageBox

WIDTH = 800
HEIGHT = 600
PLAYER_SPEED = 25

class Game(arcade.Window):
    def __init__(self):
        super().__init__(WIDTH, HEIGHT, "Simple Game")
        self.player_x = WIDTH // 2
        self.enemy_x = WIDTH - 50
        self.ui_manager = UIManager()
        self.game_over = False

    def setup(self):
        arcade.set_background_color(arcade.color.WHITE)
        self.ui_manager.enable()  # Включаем менеджер UI

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, HEIGHT // 2, 20, arcade.color.BLUE)
        arcade.draw_circle_filled(self.enemy_x, HEIGHT // 2, 20, arcade.color.RED)
        if self.game_over:
            self.ui_manager.draw()

    def update(self, delta_time):
        self.enemy_x += 0.5
        if self.enemy_x >= WIDTH:
            self.show_game_over_screen()
            self.game_over = True
        if self.game_over:
            self.ui_manager.enable()
        else:
            self.ui_manager.disable()

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= PLAYER_SPEED
        elif key == arcade.key.RIGHT:
            self.player_x += PLAYER_SPEED

    def show_game_over_screen(self):
        message_box = UIMessageBox(
            width=400,
            height=200,
            message_text="Game Over!"
        )
        self.ui_manager.add(message_box)

if __name__ == "__main__":
    game = Game()
    game.setup()
    arcade.run()

Вывод этого кода — простое модальное окно с сообщением, когда враг покидает границы экрана.

экран «игра окончена» с текстом и кнопкой

Добавление кнопок

Чтобы дать игроку выбор — перезапустить игру или выйти — добавьте кнопки в UIMessageBox и обработайте нажатия через callback.

Пример изменений (файл buttons.py или включение в предыдущий класс):

def show_game_over_screen(self):
    message_box = UIMessageBox(
        width=400,
        height=200,
        message_text="Game Over!",
        buttons=("Restart", "Exit"),
        callback=self.on_game_over_button_click
    )
    self.ui_manager.add(message_box)

def on_game_over_button_click(self, button_text):
    if button_text == "Restart":
        self.restart_game()
    elif button_text == "Exit":
        arcade.close_window()

def restart_game(self):
    self.game_over = False
    self.enemy_x = WIDTH - 50
    self.ui_manager.clear()

экран «игра окончена» с кнопками перезапуска и выхода

Пояснение: callback получает текст нажатой кнопки. В обработчике переключайте состояние, очищайте менеджер UI и сбрасывайте позицию врага.

Дополнительные возможности GUI Arcades

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

UIDraggableMixin

Смешиваемый класс, который делает виджет перетаскиваемым мышью. Подходит для плавающих окон и панелей.

UIMouseFilterMixin

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

UIWindowLikeMixin

Добавляет поведение«похожее на окно»: обработку событий и поддержку перетаскивания.

Surface

Буфер для отрисовки пользовательских элементов. Удобен для кэширования сложной отрисовки виджетов.

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

Лучшие практики при работе с GUI

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

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

Поддерживайте консистентность

Единый стиль кнопок, отступов и шрифтов делает интерфейс предсказуемым.

Дела́йте дизайн адаптивным

Расставляйте элементы с учётом разных разрешений и соотношений сторон. Проверяйте изменения окна.

Эффективная обработка событий

Обрабатывайте только нужные события. Избегайте дорогостоящих операций в обработчиках ввода.

Обратная связь пользователю

Добавляйте визуальные и звуковые отклики на нажатия и завершение действий.

Важно: протестируйте интерфейс на реальных экранах и с клавиатурой/геймпадом, если поддерживаете их.

Когда этот подход не подходит

  • Для сложных редакторов уровней или многопанельных инструментов лучше использовать специализированные GUI-фреймворки (например, DearPyGui, Qt) и встраивать их в конвейер разработки.
  • Если нужна высокая производительность UI с тысячами элементов — используйте рендеринг на уровне шейдеров и кастомные батчи.
  • Для нативных мобильных интерфейсов рассмотрите движки с мобильной поддержкой и адаптивными компонентами.

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

  • Использовать Pygame + сторонние GUI-надстройки для более низкоуровневого контроля; полезно в образовательных проектах.
  • Встраивать веб-интерфейс (HTML/CSS) и общаться через сокет; удобно для сложных редакторов контента.
  • Миграция на полноценный игровой движок (Godot, Unity) при росте команды и требований.

Методология: быстрый план интеграции GUI в проект

  1. Определите сценарии взаимодействия (меню, пауза, инвентарь).
  2. Прототип в бумаге или простом макете.
  3. Выделите отдельный слой UI и менеджер состояния (UIManager).
  4. Реализуйте минимальные виджеты и тесты взаимодействия.
  5. Добавьте адаптивность и тесты на разных разрешениях.
  6. Соберите обратную связь и доведите анимации/звуки.

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

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

  • Создать UIManager и точки инициализации.
  • Разделить логику игры и логику UI.
  • Обработать очистку при перезапуске.

Дизайнер интерфейса:

  • Задать шрифты, отступы, палитру.
  • Подготовить состояния кнопок (hover, pressed).

Тестер:

  • Проверить сценарии перезапуска и выхода.
  • Проверить поведение при изменении размера окна.
  • Тестировать клавиатуру и мышь.

Шпаргалка: часто используемые фрагменты

  • Добавить окно сообщения:
message = UIMessageBox(width=300, height=150, message_text="Hello")
ui_manager.add(message)
  • Добавить кнопки с callback:
UIMessageBox(..., buttons=("OK","Cancel"), callback=self.callback)
  • Очистить все виджеты:
ui_manager.clear()
  • Включить/выключить менеджер:
ui_manager.enable()
ui_manager.disable()

Краткий словарь

  • UIManager — менеджер виджетов и событий.
  • UIMessageBox — простое модальное окно с текстом и кнопками.
  • Mixin — класс, добавляющий поведение другому классу.
  • Surface — графический буфер для отрисовки UI.

Decision flow для действий на экране Game Over

flowchart TD
  A[Game Over] --> B{Нажата кнопка}
  B -->|Restart| C[Сброс состояния и закрыть окно]
  B -->|Exit| D[Вызвать arcade.close_window'']

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

  • Экран Game Over появляется, когда враг покидает экран.
  • На экране доступны кнопки Restart и Exit.
  • Кнопка Restart корректно сбрасывает позицию врага и скрывает окно.
  • Кнопка Exit закрывает окно приложения.
  • Менеджер UI не мешает основному игровому циклу в активном состоянии.

Риски и смягчение

  • Неправильный сброс состояния — держите все игровые данные в одном объекте состояния.
  • Утечки виджетов — обязательно очищайте UIManager при перезапусках и смене сцен.
  • Конфликты событий ввода — используйте UIMouseFilterMixin для изоляции событий внутри окон.

Резюме

Arcade предоставляет простой и понятный набор инструментов для создания игровых меню и диалогов. UIManager и UIMessageBox позволяют быстро реализовать экраны с текстом и кнопками. Для более сложных интерфейсов доступны миксины и Surface. Следуйте проверенным практикам: прототипируйте, держите состояние отдельно и тестируйте на разных разрешениях.

Важно: начните с простого прототипа и постепенно усложняйте интерфейс по мере роста требований.

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

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

Настройка Firefox через userChrome.css
Браузеры

Настройка Firefox через userChrome.css

Как ограничить использование CPU приложениями в Windows
Оптимизация Windows

Как ограничить использование CPU приложениями в Windows

Разблокировать Microsoft Store на Windows
Windows

Разблокировать Microsoft Store на Windows

Как выбрать майнинговый пул для максимальной прибыли
Майнинг

Как выбрать майнинговый пул для максимальной прибыли

Создать и присоединиться к встрече в Teams на Android
Инструкции

Создать и присоединиться к встрече в Teams на Android

Удалить все изображения в Word — быстро
Инструкции

Удалить все изображения в Word — быстро