"Бабласт" — это аркадный шутер с динамичным геймплеем и простыми правилами, разработанный на C++ с использованием библиотеки SDL2. Визуальный стиль выполнен в конфетно-пузырьковой тематике, все графические ресурсы разработаны самостоятельно, что обеспечивает целостность и уникальность проекта. Проект создан с целью демонстрации навыков разработки игр, оптимизации кода и работы с графическими библиотеками.
- Игрок управляет персонажем, запертым на арене.
- Из-за границ арены несколькими волнами приходят враги нескольких видов и атакуют персонажа.
- Игрок может стрелять в противников, целясь с помощью мыши, и передвигаться, чтобы избегать урона.
- За каждого побеждённого противника игроку начисляются очки.
- Как только игрок потеряет все жизни или противники закончатся игра заканчивается и на экран выводится количество очков, набранных во время прохождения игры.
- 10 лучших результатов хранятся в файле и выводятся на экран по запросу пользователя.
- чистый и модульный код: проект структурирован с использованием принципов ООП и SOLID;
- использование SDL2: для работы с графикой, звуком и вводом данных;
- кроссплатформенность: поддержка Windows, Linux и macOS;
- оптимизация: эффективное использование ресурсов и минимизация нагрузки на CPU/GPU;
- гибкость: возможность легко добавлять новые уровни, врагов и механики.
- язык программирования: C++17;
- библиотеки: SDL2, SDL2_image, SDL2_mixer, SDL2_ttf;
- сборка: Make;
- дополнительные инструменты: Git.
Проект разделён на два основных модуля: engine и game. Каждый модуль имеет чётко определённые обязанности и взаимодействует с другими через интерфейсы, что позволяет легко расширять функциональность и поддерживать код.
Движок отвечает за низкоуровневую работу с графикой, звуком, вводом и временем. Он абстрагирует взаимодействие с SDL2 и предоставляет удобный API для игры.
Основные компоненты движка:
- окно и рендеринг:
- создание и управление окном;
- отрисовка текстур и текста;
- поддержка камеры (перемещение, масштабирование);
- загрузка ресурсов:
- загрузка текстур, звуков и шрифтов;
- кэширование ресурсов для предотвращения повторной загрузки;
- цикл отрисовки:
- управление основным циклом игры (обновление, рендеринг);
- поддержка фиксированного FPS;
- обработка ввода:
- обработка событий клавиатуры и мыши;
- предоставление интерфейса для проверки состояния ввода;
- коллизии:
- проверка столкновений между объектами (AABB);
- оптимизация для работы с большим количеством объектов;
- время и FPS:
- управление временем (delta time);
- подсчёт и предоставление интерфейса для отображения FPS;
- сцены:
- управление переключением между сценами;
- абстракция для создания новых сцен.
Игра построена на основе движка и реализует логику, сцены и объекты. Она разделена на сцены и модули-контроллеры, которые управляют поведением объектов.
Основные компоненты игры:
Сцены представляют собой отдельные состояния игры, такие как меню, игровое поле, экран результатов и т.д. Каждая сцена имеет свой жизненный цикл (инициализация, обновление, рендеринг, завершение).
- экран меню:
- отображение главного меню;
- переход к другим сценам (игра, настройки, результаты, выход);
- экран игрового поля:
- основная игровая логика;
- управление игроком, врагами и снарядами;
- экран настроек:
- настройка параметров игры (полноэкранный режим, громкость музыки и звуков);
- экран результатов:
- отображение результатов игры (имена, очки, рекорды);
- экраны выигрыша и проигрыша:
- отображение сообщения о победе или поражении;
- возможность перезапустить игру или вернуться в меню.
Модули управляют поведением объектов и взаимодействием между ними.
- игрок:
- управление персонажем;
- обработка ввода (движение, стрельба);
- коллизии с врагами и снарядами;
- враг:
- логика поведения врагов (движение);
- генерация волн врагов;
- снаряд:
- движение снарядов;
- коллизии с игроком и врагами;
- звук:
- управление звуковыми эффектами и музыкой.
Компоненты отвечают за отображение информации на экране.
- модульность: каждый компонент (движок, сцены, контроллеры) изолирован и выполняет одну задачу;
- разделение ответственности: движок отвечает за низкоуровневые операции, а игра — за логику и отображение;
- масштабируемость: добавление новых сцен, врагов или механик не требует изменения существующего кода;
- реюзабельность: движок может быть использован в других проектах.
