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 в проект
- Определите сценарии взаимодействия (меню, пауза, инвентарь).
- Прототип в бумаге или простом макете.
- Выделите отдельный слой UI и менеджер состояния (UIManager).
- Реализуйте минимальные виджеты и тесты взаимодействия.
- Добавьте адаптивность и тесты на разных разрешениях.
- Соберите обратную связь и доведите анимации/звуки.
Чек-листы по ролям
Разработчик:
- Создать 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. Следуйте проверенным практикам: прототипируйте, держите состояние отдельно и тестируйте на разных разрешениях.
Важно: начните с простого прототипа и постепенно усложняйте интерфейс по мере роста требований.
Похожие материалы
Настройка Firefox через userChrome.css
Как ограничить использование CPU приложениями в Windows
Разблокировать Microsoft Store на Windows
Как выбрать майнинговый пул для максимальной прибыли
Создать и присоединиться к встрече в Teams на Android