Разработка казуальных игр с помощью Qt Framework

1 Что нужно для выпуска игры?

В этом разделе описано почему
я предлагаю использовать Qt Framework.

Многие хотят разрабатывать игры, но не все попробуют это делать. Совсем незначительная доля программистов завершит работу и выпустит хоть что-то, во что можно играть. На самом деле, после того, как я опубликовал ряд материалов по этой теме на блоге, ко мне начали массово писать в социальных сетях с просьбой «научить» или предложением «разрабатывать игры вместе и учиться». Все они получали от меня очень простую задачу — ссылку на одну из моих заметок с описанием заготовки игры типа этой [13] и предложение разобраться с материалом, слегка доработав пример. Ни один начинающий «Game Developer» с этим не справился.

1.1 Чужой негативный опыт. Как не потратить время впустую?

Тот факт, что десятки человек хотят что-то разрабатывать, но не могут осилить 200 строчек хорошо документированного кода говорит о том, что дальше желания у этих людей никогда не зайдет, т.к. в «дикой природе» такой код вообще редко встречается. Чего же этим людям не хватает?

  • они слишком много готовятся и слишком мало пишут код. Это проявляется например в виде просмотра десятков роликов по разработке игр, которые снимают всякие упыри;
  • они не могут определиться с игровым движком и языком программирования. На популярных форумах по программированию за последний год вы найдете десяток «проектов», где хотят писать игры, но для этого решают сначала написать свой собственный игровой движок;
  • они вечно собирают команду таких же ребят. Их беседы не уходят дальше обсуждения все тех же движков;
  • иногда они заводят блог (или используют с той же целью тему на популярном форуме), где начинают планировать разработку своих игр, описывать механизмы взаимодействия объектов в игре и т.д. Я не скидываю ссылки на такие сайты, т.к. читать их не интересно — дальше планов дело никогда не заходит.

Чтобы не стать одним из них нужно начать писать побольше кода на том языке программирования, который лучше всего знаешь. Таким языком может быть и Паскаль и Бэйсик. Надо понимать, что на нормальное освоение С++ или Java уйдет уйма времени и эта задача никак не связана с целью «разработки игр».

1.2 Мой личный опыт

Впервые разработкой игр я занялся учась на четвертом курсе — меня попросили написать игру «Питон» с разными доработками. Игру я писал на C++, а графику реализовал с помощью WinAPI. Это была курсовая, сделанная для какого-то двоечника.

Больше разработка игр меня не интересовала, но в 2012 году я случайно устроился работать в фирму, которая только этим и занималась. Пол года я писал игры на их самопальном движке, мне стало скучно, уволился. Кстати, используемый в этой конторе движок был просто ужасным, хотя с его помощью были разработаны десятки игр. Движок позволял управлять анимацией, и привязываться к таймеру. Привязка всегда осуществлялась с сallback-функции, а логика разрабатываемых игр провоцировала вкладывать одну лямбда-функцию в другую десятки раз. Код получался отвратительный.

Уволившись я за пару дней написал аналогичный движок с использованием библиотеки Qt. Написал и понял, что если использовать Qt — то такой движок вообще не нужен, т.к. в этой библиотеке есть на порядок более удобные встроенные механизмы;

В 2014 году я устроился на работу Java-программистом. С разработкой игр это связано не было, но пришлось работать и графическим интерфейсом и отображением информации на географической карте. В это время я смог оценить насколько Qt удобнее Swing и прочих библиотек построения интерфейса для Java. При этом в разработке игр огромное внимание уделяется интерфейсу.

На настоящий момент на google play можно найти две мои поделки — казуальные игрушки. Первая — ремейк старой логической игры «Полный квадрат», результаты я описал в статье «Разработка игры на С++, Qt» [1], «Публикация Qt-приложения для Android» [2]. Вторая — логическая игра на развитие памяти по мотивам школьных графических диктантов: «Разработка игры для развития памяти под Android (C++, Qt)» [3]. Каждый раз после завершения игрушки (да и других поделок) я просматриваю код и выбираю фрагменты, которые можно использовать повторно — описываю их на блоге или на форуме [4].

1.3 Чужой позитивный опыт

На Хабрахабр описано множество хороших мотивирующих статей из которых можно сделать выводы о правильном поведении успешного программиста, вот пара из них:

Вы можете поискать и другие подобные истории, но вы точно не найдете среди историй со счастливым концом такую, где автор поступил в ВУЗ, протупил 4 года, получил диплом и … — написал успешный продукт. Эти статьи мотивируют (и правильно) садиться и писать код вне зависимости от вашего образования. Читать параллельно книжки никто не запрещает.

2 Qt и мобильная разработка

В этом разделе приведены ссылки
на материалы, которые помогут вам выпустить свою первую игру

Вся эта длинная преамбула написана чтобы убедить:

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

При этом во многих школах и ВУЗах изучают язык С++, нередко при этом используют библиотеку Qt. Это объяснимо — библиотека гораздо проще, чем даже STL (имею ввиду части, касающиеся контейнеров, файлов и т.п. — то, что обычно изучают студенты). При этом далеко не каждый студент пытается собрать свое приложение для телефона, но оно с большой вероятностью будет работать точно также как десктопе и это удобно. Кстати, с помощью С++ и Qt написан мобильный клиент 2gis [8], а также Telegram [9].

О достоинствах и недостатках разработки с Qt написано много статей, при их чтении важно учитывать, что с каждым новым выпуском библиотеки решается часть проблем. Бегло просмотрев одну из них [10] можно понять, что в Qt не хватает некоторых визуальных элементов, которые, впрочем, можно реализовать вручную. Однако, стоит ли изобретать велосипед, если можно легально взять готовый в чьем-нибудь репозитории?

2.1 Заготовки для мобильной разработки игр с помощью Qt

Ниже приведены ссылки на небольшие заметки, в каждой из которых описано решение какой-либо проблемы — например, разработка элемента управления, которого в Qt не хватало или просто описание механизма, важного для разработки игр:

  1. Графическая сцена [10] — важнейший элемент для разработки игр. Эффективно реализовать ее вручную очень сложно. В Qt она может отображать одновременно тысячи элементов. На ней размещаются игровые объекты:
    1. в Qt имеются встроенный механизм для плавного изменения свойств. Для объектов сцены таким свойством могут быть координаты — в заметке «Qt — анимация на графической сцене» [12] описан соответствующий пример.

      qgraphicsitemanimation_example

    2. в играх часто используется, так называемая, спрайтовая анимация — когда анимированное изображение представляется в виде набора кадров. В заметке «Спрайтовая анимация на QGraphicsScene» [13] приведены классы, позволяющие без особого труда добавить отображение такой анимации в ваше приложение;
    3. почти во всех играх необходимо обрабатывать столкновения объектов — например, если ваш персонах при перемещении должен собирать монеты или стрелять в противников (столкновение пули и противника). В каркасе графического представления также есть готовое решение, пример использования которого приведен в заметке «Обнаружение столкновений объектов на графической сцене Qt» [14];
    4. очень часто в играх требуется загрузить большую карту и отображать ее часть около главного героя, например такой прием использовался в старом Принце Персии, Марио, Робокопе. Реализация такого поведения описана в заметке «Отображение части графической сцены Qt» [15]. Снимок экрана относится к трем последним пунктам:
  2. почитав отзывы на Google Play можно заметить, что пользователи нередко не могут разобраться в игре. Особенно в логических играх. Одним из вариантов решения проблемы является вывод справки. Это простая задача, которую в библиотеке Qt можно решить с использованием встроенных классов — справку при этом можно формировать в .html-формате, что очень удобно: «Вывод справки в html формате» [16];
  3. если у вас в игре пользователь должен иметь возможность выбрать уровень для прохождения — то вам нужно организовать меню с иконками для уровней. Иконки иногда можно загружать с фалов, а чаще их нужно строить программно. Меню должно иметь возможность прокручиваться пальцем, а также корректно перестраиваться при повороте телефона. Соответствующий компонент предложен в заметке «Меню для телефона. Скролл пальцем. QGraphicsScene» [17];
    menu-qt
  4. В заметке «Стек виджетов Qt» [18] предложен класс позволяющий очень удобно организовать стек виджетов — переключение экранов в мобильном приложении. Например, когда пользователь начал играть, но затем открыл окно помощи, в нем — окно демо-игры, … — когда он вернется в игру, его прогресс не должен исчезнуть. В заметке «Qt — обработка Android back button» [19] показано как к стеку виджетов приделать обработку стандартной кнопки Android back button.

Вот и конец. Скорее всего список заготовок будет дополняться. Однако, я предлагаю подумать начинающим Game Developer-ам подумать дважды перед тем как начинать писать свои велосипеды или кидаться на изучение новых языков. Если вы не знаете с чего начать — соберите игру типа Сокобана с использованием приведенных выше готовых классов.

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

  1. Разработка игры на С++, Qt. URL: https://pro-prof.com/archives/1520
  2. Публикация Qt-приложения для Android. URL: https://pro-prof.com/archives/1568
  3. Разработка игры для развития памяти под Android (C++, Qt). URL: https://pro-prof.com/archives/4162
  4. Форум: Использование библиотеки Qt/QML. URL: https://pro-prof.com/forums/forum/programming/cplusplus_programming/qt-library-using
  5. Как я стал андроид-разработчиком без профильного образования, попутно мешая бетон. URL: https://habrahabr.ru/post/270537/
  6. Как легко и непринужденно написать игру за 2 года. URL: https://habrahabr.ru/post/279195/
  7. Как я стал программистом. Путь от питерского бездомного до Senior Developer-а за 6 лет. URL: https://habrahabr.ru/company/veeam/blog/267187/
  8. Оптимизация Android приложений под х86. Опыт 2GIS. URL: https://habrahabr.ru/company/intel/blog/205622/
  9. Репозиторий Telegram. URL: https://github.com/Kaffeine/telegram-qt
  10. Радость и грусть разработки на Qt под Android (и не только). URL: https://habrahabr.ru/post/280528/
  11. Рисование на графической сцене Qt. URL: https://pro-prof.com/forums/topic/qgraphicsscene-drawing
  12. Qt — анимация на графической сцене. URL: https://pro-prof.com/forums/topic/qt-qgraphicsitemanimation-example
  13. Спрайтовая анимация на QGraphicsScene Qt. URL: https://pro-prof.com/forums/topic/qgraphicsscene-qt-sprite-animation
  14. Обнаружение столкновений объектов на графической сцене Qt. URL: https://pro-prof.com/forums/topic/qt_collision_detection
  15. Отображение части графической сцены Qt. URL: https://pro-prof.com/forums/topic/qt_part_of_qgraphicsscene
  16. Вывод справки в html формате. URL: https://pro-prof.com/forums/topic/qt-html-tutorial
  17. Меню для телефона. Скролл пальцем. QGraphicsScene. URL: https://pro-prof.com/forums/topic/menu-android-scroll
  18. Стек виджетов Qt. URL: https://pro-prof.com/forums/topic/screensstack-qt
  19. Qt — обработка Android back button. URL: https://pro-prof.com/forums/topic/qt-handling-android-back-button
  • 124
    Поделились

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *