Разработка игры для развития памяти под Android (C++, Qt)

Накидал очередную игрушку под Android. Поделка оказалась играбельной, выложил на маркет и решил написать статью о процессе разработки. Вообще, на habrahabr есть куча статей в стиле “моя первая игра под Android”, но зачастую [1,2]:

  • играть в это совсем скучно;
  • в комментариях жалуются на отсутствие технических деталей;
  • разработчик не предоставляет читателям какую-либо часть кода для использования в других проектах или этот код настолько плохой, что его невозможно использовать.

Я решил исправить эти недочеты в своей статье. Код я писал на С++ и использовал библиотеку Qt.

Краткая история разработки

Раздел не содержит технических деталей, но прочитав его вы возможно сэкономите время.

2 года назад у одного первоклассника я увидел так называемые “графические диктанты” – на листе в клеточку стоит начальная точка и даны указания на подобии “две клетки направо, одна – вниз, …”. Школьник выполняет рисунок по этим подсказкам и если все сделает правильно – на листе получается какой-нибудь жираф или песик. Мне это понравилось (и детям их нравится рисовать), однако расстраивало то, что диктанты эти надо постоянно распечатывать – я решил сделать такую же штуку для компьютера и телефона.

Через час штуковина для Android, на которой можно было рисовать по клеточкам была готова, еще через пару часов в приложение загружались уровни, которые запускались последовательно друг за другом. Тут выявилась основная проблема – графические диктанты направлены на развитие у детей не только навыка счета клеточек, но (главное) – мелкой моторики при рисовании линий. То-есть вне зависимости от того, как качественно все будет реализовано – игра будет бесполезной, т.к. от тыканья пальцем по экрану моторика не развивается. Я отложил “проект” на пол года, а затем пришла мысль доработать приложение с уклоном на развитие памяти.

Все было быстро написано, потом долго рефакторилось. Затем, игра была заново спроектирована (мне нужен был пример для статьи “Процесс разработки программного обеспечения ICONIX” [3]. При этом я нашел ряд недочетов в коде, что-то поправил и вот, выкладываю: ссылка на скачивание игры с Google Play.

drawing_screenshot

Снимок игрового экрана

Изначально планировалась игра для детей, но оказалась не такой простой (не уверен что дети потянут).

Технические детали и повторно-используемый код

Исходный код игры можно взять с репозитория.

О процессе проектирования прочитать в статье “Процесс разработки программного обеспечения ICONIX” [3], хотя исходный код не совсем соответствует диаграммам.

Игра реализована с использованием графической сцены Qt (QGraphicsScene [4]) – на нее помещаются элементы, представляющие собой квадрат с изображенным крестом по центру (класс Item, наследник QGraphicsItem). Из них формируется сетка, на которой происходит рисование. Элементы обрабатывают нажатия мыши – именно поэтому если пользователь щелкнет мимо сетки, будет выбран ближайший узел. Рисование линий на графической сцене описано в заметке Рисование на QGraphicsScene [5].

При написании своей предыдущей игры я сделал очень простое меню в Qt Designer[6]. Меню было не удобным, на этот раз я сделал лучше, при этом постарался сделать код удобным для повторного использования. Среди прочего – меню перестраивается с учетом ориентации телефона (горизонтальная/вертикальная). Код меню и пример использования можно взять в репозитории, а нечто типа документации я поместил в заметку: Меню для телефона. Скролл пальцем. QGraphicsScene [7].

Также, почти в любом приложении должна отображаться справочная информация для пользователя. В прошлой игре вместо справки я реализовал демо-игру (с подсказками), а на этот раз использовал более универсальное решение, которое подойдет почти всем. Справка отображается в html-формате. Опять же, код – в репозитори, а описание – в заметке: Вывод справки в html формате [8].

В ряде случаев в приложении нужна кнопка “вернуться назад”, а в Android вообще есть специальная кнопка для этого (Android back button) – если вы не будете обрабатывать [9] события от нее, то по умолчанию она будет закрывать ваше приложение, а это не очень здорово. Внутри приложения переход на предыдущий экран нужен, например, если справку пользователь может открыть с разных экранов и после просмотра справки надо вернуться “назад”. Я решил выделить для этого специальный класс, реализующий стек виджетов. В статье вы сможете узнать чем он отличается от стандартных QStackedLayout и QStackedWidget, а также найти ссылку на репозиотрий: Стек виджетов Qt [10].

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

  1. Создание простой 2D игры на Android. – URL: https://habrahabr.ru/post/136802/;
  2. Как я потратил отпуск на свое первое приложение. – URL: https://habrahabr.ru/post/310206/;
  3. Процесс разработки программного обеспечения ICONIX. – URL: https://pro-prof.com/archives/4126;
  4. Работа с графической сценой [Qt]. – URL: https://pro-prof.com/archives/1117;
  5. Рисование на QGraphicsScene. – URL: https://pro-prof.com/forums/topic/qgraphicsscene-drawing;
  6. Собственные виджеты в Qt Designer. – URL: https://pro-prof.com/archives/958;
  7. Меню для телефона. Скролл пальцем. QGraphicsScene. – URL: https://pro-prof.com/forums/topic/menu-android-scroll;
  8. Вывод справки в html формате. – URL: https://pro-prof.com/forums/topic/qt-html-tutorial;
  9. Qt — обработка Android back button. – URL: https://pro-prof.com/forums/topic/qt-handling-android-back-button;
  10. Стек виджетов Qt. – URL: https://pro-prof.com/forums/topic/screensstack-qt.
  11. Ссылка на скачивание игры с Google Play. – URL: https://play.google.com/store/apps/details?id=org.qtproject.example.drawmind

Добавить комментарий