Как я создал игру для разработчиков на Flutter

Всем привет! На связи Амир Утеуов — ML-инженер в Авито.

В этой публикации я расскажу историю создания мобильной игры DevRush — пет-проекта, который эволюционировал до полноценной активности на стенде IT-конференции CodeFest 2025.

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

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

Подробное содержание первой части:

  1. Почему именно Flutter?

  2. Подбор технологического стека для иконок

  3. Геймплей и механики

  4. Реализация на Flutter

  5. Главный вызов: векторная анимация

  6. Визуализация экрана победы

  7. Сборка и дистрибуция

  8. Прохождение модерации

  9. Итоги

  10. Что почитать по теме

Почему именно Flutter?

Начнем с фундаментального вопроса — выбора инструментария для разработки.

Меня привлекает концепция кроссплатформенности: когда единожды написанный код успешно функционирует на iOS, Android, десктопах и в вебе. Проанализировав множество вариантов, я остановился на Flutter.

Flutter — мощный фреймворк для создания кроссплатформенных приложений, использующий язык Dart.

Dart — это лаконичный C-подобный язык, разработанный Google специально для подобных задач. Он существенно упрощает разработку за счет продвинутых инструментов. К примеру, hot reload позволяет мгновенно видеть изменения в коде, отображающиеся в эмуляторе или на реальном устройстве, будь то верстка, бизнес-логика или вычислительные переменные в рантайме.

Flutter предлагает богатую библиотеку виджетов с возможностью гибкой настройки дизайна. А механизм event loop обеспечивает эффективную асинхронную работу в одном потоке.

Изучив официальные материалы по Flutter и отличный бесплатный курс по Dart, я, не имея опыта в геймдеве, приступил к реализации.

Следующим этапом стала архитектурная схема приложения:

Приложение требовало экранов главного меню, самой игры, информационного раздела и экрана завершения. Также был критически важен таймер обратного отсчета.

Игровую логику я реализовывал самостоятельно, не подозревая о существовании движка Flutter Flame (сейчас бы, конечно, выбрал его). Изначально я установил таймер на 16 секунд, но позже увеличил его до 32, так как этого времени игрокам не хватало.

Тут еще больше контента
Тут еще больше контента

Выбор технологий для иконок

Я отбирал только те языки программирования, которые на слуху. Чтобы игра была доступной, я включил в неё как активно используемые, так и стабильные языки, имеющие сильное сообщество и регулярные обновления.

Поэтому в датасет попал, например, Fortran (так как он развивается), но не вошел экспериментальный или альфа-версионный софт. Также я сделал акцент на языках общего назначения (general-purpose), исключив узкоспециализированные вроде 1C или SAP ABAP, а также языки смарт-контрактов (Solidity, Plutus) и разметки.

Технологий в мире бесчисленное множество (миллионы пакетов в репозиториях вроде PyPI, Maven или npm), поэтому я отобрал около 250 наиболее узнаваемых.

Геймплей

Напомню задумку: игроку предлагается за ограниченное время отыскать нужную иконку среди массива других.

Прогрессия сложности устроена так:

  1. Уровень «Junior»: у каждой иконки есть текстовая подсказка с названием технологии.

  2. Уровень «Middle»: подсказки есть только у половины иконок, ориентируемся на визуальную память.

  3. Уровень «Senior»: подсказок нет, ищем исключительно по логотипу.

Посмотрев на датасет, я понял, что интуитивно узнаю около 90% иконок. Чтобы сделать игру познавательнее, я написал Python-скрипт, который через DuckDuckGo API подтягивал краткое описание для каждой технологии.

Вышло довольно информативно:

ae04c06884a59f83e4c2eb07884e46f6.png

Для ускорения релиза все описания оставил на английском языке.

8e1a1dff1106ba8a2bbc67351983da46.png
Таблица с информацией для игры

Реализация проекта на Flutter

Настройка окружения — первый этап, где возможны сюрпризы в зависимости от ОС. Использовать шаблонные проекты Flutter для Web, Desktop или мобильных платформ удобно из консоли VS Code. Альтернатива — FlutLab, если вы предпочитаете облачную разработку без установки зависимостей локально.

Я создал структуру проекта, добавляя нужные экраны и логику. Ключевой момент — понимание работы event loop во Flutter: если перегрузить основной поток вычислениями, приложение начнет «фризить».

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

Ресурсы (иконки, датасет, анимации) хранились в папке assets. Использовал PNG из-за поддержки прозрачности. Некоторые иконки терялись на фоне, поэтому пришлось программно добавить возможность контурной обводки.

В первой версии метаданные о файле я «зашивал» прямо в его имя, например: «Python_pr_nbrr.png» означало «технология Python, категория Programming Language, без необходимости границы (no border)». Не самый изящный подход, но для MVP сработал.

Игра насчитывала 64 уровня с динамически увеличивающимся количеством иконок на поле 4×4. Также реализовал режим контеста: за счет фиксированного random seed на разных устройствах генерировалось одинаковое поле — отличный вариант для дружеских соревнований.

fe6a16cb6d42d07bf1c18b4e8df5abb3.png
19f783260878185819849410e4e1dcee.png
Экраны моей игры

На экране победы, как вишенка на торте, появилась анимация статистики.

Жми сюда!
Жми сюда!

Главный вызов: векторная анимация

Больше всего времени ушло на создание анимации разлетающихся иконок в формате Lottie. Я генерировал их с помощью Python-скриптов, настраивая эффекты взрыва через easings.

Процесс напомнил уроки информатики: перемещение частиц по физическим формулам. Чтобы анимация не казалась однообразной, я сделал 10 различных вариантов, выбираемых случайным образом. Конечно, логику можно было реализовать на чистом Dart, но тогда это казалось слишком сложной задачей.

Визуализация экрана победы

Сборка и дистрибуция

Flutter поддерживает сборку под множество платформ. Для Android предпочтительно использовать формат App Bundle (.aab), который оптимизирует размер загружаемого контента, подгружая только необходимые ресурсы для конкретного устройства. Для iOS, в свою очередь, обязательны Mac OS и свежий Xcode.

Учитывая текущие ограничения для разработчиков из РФ, создание платных приложений невозможно — только бесплатный софт без внутренней монетизации.

Самым кропотливым этапом стала настройка сертификатов и ключей для подписи приложений. Важно помнить, что структура Flutter-проекта включает папки Android и iOS с метаданными — фактически, это отдельные проекты, которые можно открывать в Android Studio или Xcode, но основная работа ведется на уровне кода Flutter.

Прохождение модерации

Первая попытка релиза в App Store закончилась отклонением из-за «рекламы конкурентов» — на одном из скриншотов присутствовала иконка Android. Мне пришлось удалить её, хотя в контексте игры это было вполне логично.

95172a751de8c5def6a0f9b585f6cd2d.png

Этот опыт заставляет думать, что Apple использует автоматизированные системы анализа изображений.

Итоги

  1. Геймдев — это увлекательный и познавательный процесс.

  2. Первая публикация — серьезный бюрократический этап.

  3. Четкое проектирование на старте помогло избежать глобальных переделок в ходе разработки.

  4. Flutter отлично подходит для таких проектов: ресурсов фреймворка более чем достаточно.

  5. Чтобы избежать проблем с производительностью, важно не перегружать event loop — выносите тяжелые вычисления в отдельные потоки.

  6. Работа с векторной анимацией (Lottie + Python) — тема для отдельной глубокой статьи.

To be continued

Игра жила своей жизнью, пока коллеги не предложили адаптировать её для стенда Авито на конференции Code Fest 2025. О новом дизайне, веб-лидерборде и том, как прошла активность — в следующей статье!

Что еще посмотреть по теме

Кликни здесь и узнаешь
Кликни здесь и узнаешь
 

Источник

Читайте также