создание мобильных игр на телефоне
Туториал: Создание простейшей 2D игры на андроид
Этот туториал предназначен в первую очередь для новичков в разработке под андроид, но может быть будет полезен и более опытным разработчикам. Тут рассказано как создать простейшую 2D игру на анроиде без использования каких-либо игровых движков. Для этого я использовал Android Studio, но можно использовать любую другую соответствующее настроенную среду разработки.
Шаг 1. Придумываем идею игры
Для примера возьмём довольно простую идею:
Внизу экрана — космический корабль. Он может двигаться влево и вправо по нажатию соответствующих кнопок. Сверху вертикально вниз движутся астероиды. Они появляются по всей ширине экрана и двигаются с разной скоростью. Корабль должен уворачиваться от метеоритов как можно дольше. Если метеорит попадает в него — игра окончена.
Шаг 2. Создаём проект
В Android Studio в верхнем меню выбираем File → New → New Project.
Тут вводим название приложения, домен и путь. Нажимаем Next.
Тут можно ввести версию андроид. Также можно выбрать андроид часы и телевизор. Но я не уверен что наше приложение на всём этом будет работать. Так что лучше введите всё как на скриншоте. Нажимаем Next.
Тут обязательно выбираем Empty Activity. И жмём Next.
Тут оставляем всё как есть и жмём Finish. Итак проект создан. Переходим ко третьему шагу.
Шаг 3. Добавляем картинки
Скачиваем архив с картинками и распаковываем его.
Находим папку drawable и копируем туда картинки.
Позже они нам понадобятся.
Шаг 4. Создаём layout
Находим activity_main.xml, открываем вкладку Text и вставляем туда это:
На вкладке Design видно как наш layout будет выглядеть.
Сверху поле в котором будет сама игра, а снизу кнопки управления Left и Right. Про layout можно написать отдельную статью, и не одну. Я не буду на этом подробно останавливаться. Про это можно почитать тут.
Шаг 5. Редактируем MainActivity класс
В первую очередь в определение класса добавляем implements View.OnTouchListener. Определение класса теперь будет таким:
Добавим в класс нужные нам статические переменные (переменные класса):
В процедуру protected void onCreate(Bundle savedInstanceState) <
добавляем строки:
Классы LinearLayout, Button и т.д. подсвечены красным потому что ещё не добавлены в Import.
Чтобы добавить в Import и убрать красную подсветку нужно для каждого нажать Alt+Enter.
GameView будет подсвечено красным потому-что этого класса ещё нет. Мы создадим его позже.
Теперь добавляем процедуру:
Если кто-то запутался ― вот так в результате должен выглядеть MainActivity класс:
Итак, класс MainActivity готов! В нём инициирован ещё не созданный класс GameView. И когда нажата левая кнопка — статическая переменная isLeftPressed = true, а когда правая — isRightPressed = true. Это в общем то и всё что он делает.
Для начала сделаем чтобы на экране отображался космический корабль, и чтобы он двигался по нажатию управляющих кнопок. Астероиды оставим на потом.
Шаг 6. Создаём класс GameView
Теперь наконец-то создадим тот самый недостающий класс GameView. Итак приступим. В определение класса добавим extends SurfaceView implements Runnable. Мобильные устройства имею разные разрешения экрана. Это может быть старенький маленький телефон с разрешением 480×800, или большой планшет 1800×2560. Для того чтобы игра выглядела на всех устройствах одинаково я поделил экран на 20 частей по горизонтали и 28 по вертикали. Полученную единицу измерения я назвал юнит. Можно выбрать и другие числа. Главное чтобы отношение между ними примерно сохранялось, иначе изображение будет вытянутым или сжатым.
unitW и unitW мы вычислим позже. Также нам понадобятся и другие переменные:
Конструктор будет таким:
Метод run() будет содержать бесконечный цикл. В начале цикла выполняется метод update()
который будет вычислять новые координаты корабля. Потом метод draw() рисует корабль на экране. И в конце метод control() сделает паузу на 17 миллисекунд. Через 17 миллисекунд run() запустится снова. И так до пока переменная gameRunning == true. Вот эти методы:
Обратите внимание на инициализацию при первом запуске. Там мы вычисляем количество пикселей в юните и добавляем корабль. Корабль мы ещё не создали. Но прежде мы создадим его родительский класс.
Шаг 7. Создаём класс SpaceBody
Он будет родительским для класса Ship (космический корабль) и Asteroid (астероид). В нём будут содержаться все переменные и методы общие для этих двух классов. Добавляем переменные:
Шаг 8. Создаём класс Ship
Теперь создадим класс Ship (космический корабль). Он наследует класс SpaceBody поэтому в определение класа добавим extends SpaceBody.
и переопределим метод update()
На этом космический корабль готов! Всё компилируем и запускаем. На экране должен появиться космический корабль. При нажатии на кнопки он должен двигаться вправо и влево. Теперь добавляем сыплющиеся сверху астероиды. При столкновении с кораблём игра заканчивается.
Шаг 9. Создаём класс Asteroid
Добавим класс Asteroid (астероид). Он тоже наследует класс SpaceBody поэтому в определение класса добавим extends SpaceBody.
Добавим нужные нам переменные:
Астероид должен появляться в случайной точке вверху экрана и лететь вниз с случайной скоростью. Для этого x и speed задаются при помощи генератора случайных чисел в его конструкторе.
Астероид должен двигаться с определённой скорость вертикально вниз. Поэтому в методе update() прибавляем к координате x скорость.
Так же нам нужен будет метод определяющий столкнулся ли астероид с кораблём.
Рассмотрим его поподробнее. Для простоты считаем корабль и астероид квадратами. Тут я пошёл от противного. То есть определяю когда квадраты НЕ пересекаются.
((x+size) (shipX+shipSize)) — корабль справа от астероида.
((y+size) (shipY+shipSize)) — корабль снизу астероида.
Между этими четырьмя выражениями стоит || (или). То есть если хоть одно выражение правдиво (а это значит что квадраты НЕ пересекаются) — результирующие тоже правдиво.
Всё это выражение я инвертирую знаком!. В результате метод возвращает true когда квадраты пересекаются. Что нам и надо.
Про определение пересечения более сложных фигур можно почитать тут.
Шаг 10. Добавляем астероиды в GameView
В GameView добавляем переменные:
также добавляем 2 метода:
И в методе run() добавляем вызовы этих методов перед вызовоом control().
Далее в методе update() добавляем цикл который перебирает все астероиды и вызывает у них метод update().
Такой же цикл добавляем и в метод draw().
Вот и всё! Простейшая 2D игра готова. Компилируем, запускаем и смотрим что получилось!
Если кто-то запутался или что-то не работает можно скачать исходник.
На этом всё. Пишите отзывы, вопросы, интересующие вас темы для продолжения.
Разработка HTML5 игры под Android с нуля и до релиза
Вместо вступления
Потратив несколько суток подряд (без перерыва на сон) на изучение поддержки HTML5 всеми любимыми Android-гаджетами, решил, что данной теме стоит уделить внимание. В статье постараюсь раскрыть по шагам все этапы (конечно же базовые/ключевые/основные) создания HTML5 Игрового приложения для Android от идеи до релиза самого APK файла. Возможно, ничего нового я и не открою маститым разработчикам, но для новичков постараюсь описать все как можно проще, со скриншотами и пояснениями.
Желающих узнать подробнее приглашаю под кат.
Вообще много можно говорить о потенциале Android, о развитии HTML5 и об их взаимодействии. Я этого делать не буду. Так что, сразу к делу.
Идея создания игры под Android наверняка заседает в разумах десятков сотен разработчиков, и тех, кто себя таковыми считает. Я не исключение.
Весь процесс будет разбит на несколько шагов а итоговое приложение будет состоять из двух частей:
— Обертка (в данном случае для Android)
— Игра
Шаг 1. Написание самой игры
Еще одним плюсом написания игры на HTML5 является тот факт, что для тестирования не требуется куча запущенных программ, IDE, эмуляторов и так далее. Нужен лишь браузер (в моем случае это Chromium) и текстовый редактор (BlueFish)
Игра будет несложной: есть синий прямоугольник и есть зеленый прямоугольник. Задача игрока — перетащить синий прямоугольник на зеленый в обход красного, который перемещается по игровому полю в произвольном направлении.
Для разработки игры буду использовать J2ds (игровой движок).
На качество кода игры внимания можно не обращать, ибо не это цель статьи. Хотя конечно, можно оптимизировать сколько угодно, этот процесс вообще наверное бесконечен.
Шаг 2. Android Studio. Создание обертки для игры
Я не собираюсь ни с кем мериться крутостью той или иной IDE для разработки под Android, а покажу на примере Android Studio. Для работы нам потребуется:
— Java машина (под мою Linux подходит OpenJDK);
— Дистрибутив Android Studio.
Как только все установите (Этих двух программ достаточно), запускайте Android Studio.
Откроется стартовое окно (если первый запуск), если не первый — то откроется сама IDE, но сути не меняет, пройдем в SDK Manager:
Тут нужно галочками отметить необходимые вам версии Android, с которыми вы будете работать, в моем случае это Android 4.4.2, вы можете выбрать хоть все сразу.
Главное — выберете обязательно «Tools» и «Extras» и нажимайте «install packages».
Как только у вас все скачалось, запустится IDE с унылым серым фоном и несколькими кнопками, жмем первую и создаем новый проект. Если IDE запустилась сразу в рабочем состоянии, то: «File->New->New Project»
Заполняем необходимые поля, и жмем Next
Выбираем нужную версию андроида и Next
Тут выбираем Blank Activity (пустой шаблон с Hello, World!)
В следующем окне заполняем данные для создания классов, я менять не буду для наглядности:
Торжественно жмем Finich и ждем, пока IDE все сконфигурирует и подготовит для работы.
Откроется окно с дизайнером форм. Оно не такое, как в Lazarus, Delphi, но что-то схожее все равно имеется:
Не спешите ничего менять или что-то щелкать, настройка еще не окончена. Открываем «Tolls->Android->AVD Manager» для настройки эмулятора.
Тут, если ничего нет, жмем «Create Virtual Device», если есть, можете не создавать новый, у меня уже был, т.к. я «натыкал» его, пока разбирался. Если же вам нужно создать новый эмулятор, то там все просто:
1. Выбираем размер экрана и модель телефона
2. Выбираем версию андроида (у меня 4.4.2)
3. Настраиваем устройство.
На третьем шаге подробнее:
Т.К. игра у нас вытянута по горизонтали, выбрать нужно ландшафтный режим.
Когда все настройки введены, жмем на зеленый треугольник и запускаем эмулятор. После запуска ждем, когда устройство полностью загрузится и запустится ОС:
Это окно не закрывайте, в нем будет происходить эмуляция. Теперь можно вернуться в редактор, и изменить ориентацию в дизайнере форм:
Можно запускать! Вот теперь точно можно.
Если появится запрос на выбор эмулятора — то можно поставить галочку внизу:
Мои поздравления! Все работает, проверено!
Сворачиваем наш эмулятор (Но не закрываем!) и переходим в редактор, Там все немного сложнее (чуть-чуть).
Переключиться нужно в режим «Text». У вас в activity_main описаны все элементы, которые есть на форме. Включая саму форму. Да и не форма это вовсе.
Т.к. мы делаем игру в HTML5, а тут у нас только обертка для игры, удаляем весь текст и вставляем следующее:
Теперь, если опять переключиться на дизайн, то выглядеть будет иначе:
Как видно, теперь вместо «Hello, World» во всю красуется растянутый на весь экран — WebView. Этот объект и является нашим «окном» в игровой мир.
Можете запустить даже, посмотреть, будет белый экран. Идем дальше.
А дальше нам нужно перейти в наш проект, для этого слева открываем поле «Project» и выбираем вкладку «Android», если не выбрана:
В этой вкладке представлена структура проекта и все его внутренние файлы и ресурсы.
Пришло время поработать над функционалом нашего «браузера», ведь это именно он! Открываем класс «MainActivity.java» и удаляем все лишнее, оставив только основное:
Если не забыли, мы в файле activity_main добавили WebView, обратите внимание на выделенную жирным строчку:
Нам нужно объявить объект класса WebView.
Для этого к списку импортов дописываем:
А затем объявляем наш объект myWeb внутри класса MainActivity:
Теперь, после строчки setContentView(R.layout.activity_main); вставляем следующий код:
Вот что получилось у меня в редакторе:
А вот, что в эмуляторе:
Если у вас так же — мы на верном пути!
Осталось дело за небольшим:
Там, где мы подгружаем страницу нашему браузеру, путь к файлу выглядит так: «file:///android_asset/index.html»
Следует учесть, что любые файлы мы можем хранить внутри нашей игры, имея к ним доступ.
Дальше все совсем просто — копируем нашу игру в папку assets:
Файл index.html — это тот самый index из начала этой статьи. Ну что, пробуем запустить!
Небольшой совет: тестировать лучше всего на реальном устройстве посредством USB, так результаты теста будут нагляднее, да и управлять мышью не самый удобный вариант, не говоря уже о множественном нажатии.
Шаг 3. Android Studio. Сборка приложения и его подписывание
Когда игра вами полностью отлажена (в браузере или на эмуляторе), обертка полностью готова и все этапы разработки позади, можно собирать приложение. Android Studio позволяет собирать приложения и подписывать их вашими ключами.
Для создания ключей в этой IDE есть специальная утилита «KeyTool».
Если ранее ключей и алиасов вы не создавали, нажимайте «Create New». Заполнить поля можете на свое усмотрение, достоверность данных целиком лежит на вас.
Первое поле — это путь к папке, в которую будет сохранен ключ. Форма после нажатия Ok заполнится автоматически:
Для последующих приложений создавать новые ключи не обязательно, вы можете подписывать вашим ключем и другие приложения, именно для этого и есть кнопка «Choose Existing».
На следующем шаге IDE попросит у вас еще раз ввести пароль, а затем указать папку для сохранения APK файла.
Теперь можете расслабиться и попить, к примеру, кофе.Система начала компиляцию, результат в статусбаре:
После того, как компиляция завершится, система вам об этом сообщит.
Теперь достаточно переместить файл на телефон / планшет и установить, как обычное приложение.
Разработка мобильных игр — тернистый путь падавана
Картинка здесь эта потому лишь, что «Звездных воин» фанат я, и телефон тут есть еще
Доброго времени суток. Меня зовут Александр, я фронтенд-разработчик в небольшой компании, но речь в статье пойдет о моем хобби, если его можно так назвать – разработка мобильных игр. Хочу поведать историю моего знакомства и дальнейшего погружения в эту область и поделиться опытом с теми, кто хочет себя попробовать в качестве инди-разработчика, но сомневается. Также интересно узнать мнение опытных разработчиков по поводу тех идей, которые я пытался реализовать. Начну, пожалуй, издалека.
Не так давно, в одной далекой-далекой сибирской провинции
В настоящий момент я проживаю в культурной столице необъятной нашей родины, но в 2015 году, находясь в родном сибирском городе одного далекого региона на очередных умопомрачительных зимних каникулах, я сидел дома и не знал, чем себя занять, так как выходить на улицу в минус 30 градусов желания особо не было. Я учился в местном институте, грубо говоря, на программиста, мне приглянулась эта специальность еще со школы, когда родители отдали меня на курсы программирования для дополнительного образования. Программировать мне нравилось, учиться в институте — нет.
Я сидел за компьютером, как вдруг неожиданно прилетела в голову одна интересная мысль – почему бы не попробовать сделать простенькую мобильную игру? Вообще, мысль не совсем неожиданная, я был под впечатлением от ошеломляющего успеха одной игры про птичку, которая летала между трубами, и тот факт, что её сделал один человек, периодически всплывал в голове, но времени на обдумывание и взвешивание как-то не хватало, ведь помимо учебы я еще и подрабатывал. Но вот зимние каникулы, на улице мороз – была, не была, попробую сделать что-то простое и легкое.
Атака клонов
Какой только гадостью ни займешься, лишь бы игру скачивали
Благо, я был не одинок во вселенной мобильной разработки. Друг, вдохновившись моим успехом, пусть и первоблиннокомным, также ударился в разработку игр, но с одной особенностью – он не стал делать оригинальную игру, а решил забабахать клон известной игры, аргументируя это тем, что в этом случае не придется заниматься продвижением – ведь оригинальную игру постоянно скачивают, ее проходят, и людям хочется еще, так они рано или поздно доберутся и до его клона. Но клон был не тупая копирка – он добавил одну фичу, которая изменила игровой процесс и сделала его немного сложнее, но интереснее. Впоследствии, как мне и ему думается, это и сыграло свою роль – его игра одно время держалась на втором месте в Google Play Market, то есть сразу после оригинальной игры. Я же первое время скептически относился к этой затее. Хотя друг мне говорил, что нужно продолжать двигаться в этом направлении, после провала, хоть и ожидаемого, моей первой игры, я совсем перестал этим заниматься и ушел в подполье.
Но в этой жизни все циклично. Успех теперь уже игры друга вновь зажег во мне интерес к мобильной разработке и я пошел по его стопам – я начал делать клон этой же самой игры. Инструментом для разработки стал фреймворк Unity, только потому, что я неплохо знал C# (писал на нем диплом), хотя игра была двумерной и использовать такую мощную штуку для создания 2D игры было нелогично, но меня это не особо волновало. Клон игры я делал в сумме месяца три, но между двумя и одним месяцем работы вклинился переезд в другой город и поиск работы, потому мой клон появился в Google Play Market осенью 2016 года, спустя год с лишним после последнего обновления моей первой игры (я ею занимался до мая 2015).
Помимо этого, еще мой друг в своей игре (она уже на тот момент была на втором месте) поместил ссылку на мою, и вот до сир пор задаюсь вопросом, что повлияло на успех моего клона – та же фича, или поток пользователей с игры друга. Но факт остается фактом – моя игра какое-то время держалась на третьем месте, но, к сожалению, на данный момент она в районе 30 места, но это меня уже не трогает – клон он и есть клон – паразитизм на оригинальной игре не особо прельщает разработчика, который хочет сделать что-то свое, классное и нравящееся людям.
Собственно, после падения клона все ниже и ниже по ступенькам маркета я решил, что пора уже серьезно подойти к делу и сделать, наконец, игру, которую я хотел сделать самой первой, но понял, что не потяну и отложил до лучших времен. Времена настали – я набрался неплохого опыта в процессе разработке на работе и за плечами были целых две полноценных игры. Но я хотел все-таки залезть и в яблочную обитель, потому собрался с силами, поголодал, походил пешочком на работу, продал все, что можно было продать и купил себе Макбук. Правда, за разработку игры я сел только спустя полгода после его покупки – что поделать, такова натура ленивого программиста, пока не ударит муза творчества и логики, не начнешь неистово стучать по клавишам своими программистскими пальцами.
Новая надежда
Мне представляется, что глаза во время вдохновения именно так и выглядят
Буду честен – корыстная подоплека меня также преследовала. А кому не хочется заодно подзаработать на своих творениях? Вот и я хотел, и даже кое-какие деньги заработал со своего клона – смешные, но все-таки деньги. Потому создание оригинальной игры не требовало отлагательств. И вот, летом 2017 года, когда я все-таки соизволил начать использовать Макбук по назначению, я задумался не на шутку – что использовать для создания игры на этот раз? Игра 2D, довольно много уровней, есть особенности в движении игрока – что выбрать? И тут на помощь снова пришел мой друг. «Пиши нативное» — сказал он мне. Я подумал и решил – а чем черт не шутит, попробую использовать всю мощь того, что Apple предоставляет для разработки мобильных игр. Но стоит сделать оговорку – если бы не язык Swift, я бы отказался от этой затеи, потому что Objective C я не воспринимаю, не знаю, это субъективно. Swift мне сразу понравился, я потратил пару вечеров на ознакомление с основными его особенностями и приступил к активным действиям. Я понимал, что я один, и никто мне не поможет, только разве что за деньги, которых нет. То, что прилетало с клона, откладывал и в итоге потратил на айфон для тестирования новой игры.
Итак, я умею (по-крайней мере, я в это верю) программировать, не смыслю ничего в дизайне, в проектировании игровых уровней, в продвижении игры, и нет денег на соответствующих специалистов. В таких жестких рамках приходится напрягать мозги и фантазию, и в конечном итоге родилась авантюрная идея.
Проблемы с дизайном? Значит делаю игру в стиле минимализма — круг белого цвета с узором посередине в качестве игрока и прямоугольники в качестве препятствий. Нужно будет управлять этим кругом, нажимая на левую или правую часть экрана телефона так, чтобы не столкнуться с препятствиями, которые опускаются сверху вниз с одной скоростью, но в разных положениях по оси x (слева, посередине, справа).
Отлично, начало положено, но это слишком примитивно и быстро надоест. Усложняем — пусть с каждым уровнем меняется либо количество препятствий (для себя я их называл стенами), либо их качество: пусть стены либо двигаются слева направо и наоборот, либо вращаются против и по часовой стрелке, либо медленно исчезают, либо различные вариации выше сказанного.
Но это позволит разбавить игру на еще 15 — 20 уровней, а мне надо больше. Кстати, а сколько вообще уровней будет в игре? И тут мне пришла в голову мысль — а что, если моя игра в названии будет содержать просто число, означающее количество уровней, но это число будет пересекаться с известной игрой? Я вспомнил головоломку «94%». Прикинув, что большинство людей ленивы и им хочется быстрее добраться до интересующей их игры, набирая на клавиатуре мобильного телефона “94”, они вряд ли будут переключать раскладку в поисках заветного знака “%”, а просто нажмут “Найти” после ввода двух цифр. Я проверил в App Store — действительно, набрав “94”, на первом месте появится игра “94%”.
Замечательно, значит я делаю игру в минималистическом стиле с названием 94. Заранее предполагаю, что проблемы с дизайном и продвижением решены. Ведь, как я предполагал, игра с точным совпадением по названию в строке поиске должна показываться выше всех, или хотя бы в первой десятке (ага, размечтался). Но как придумать 94 уровня, причем интересных и разнообразных, чтобы после первой десятки пользователь не зевнул во весь рот и не удалил игру. Добавил новые виды стен — тройные (то есть три стены с двумя “дырками”) и тройные с подвохом (только через одну из “дырок” можно пройти, я их про себя называл тройные стены с обманом). Но все равно мало. Может быть, с игроком (кругом) что-то сделать?
Конечно же, все на поверхности. Пусть с каждым новым игровым блоком (я решил 94 уровня разделить на блоки, или эпизоды, 10 блоков по 9 уровней и последний с 4 уровнями) игрок начинает по-другому двигаться. То есть нажатие на половины экрана телефона те же, а реакция другая. Так появились следующие типы движений игрока:
Итак, закончив свое детище, я был в следующем положении — игра в минималистическом стиле с названием “94”, означающее лишь количество разнообразных уровней, которые нужно пройти. Подобных игр я не нашел — сделал вывод, что она оригинальная, чего я и добивался. Вдобавок ко всему я решил, что если нет букв в названии, то и в игре их не будет, все постарался сделать интуитивно понятным без слов. Потом оказалось, это дало мне неплохое преимущество — игру можно распространять во всех странах, не заморачиваясь с локализацией, которая тоже денег стоит. Все сложилось как нельзя лучше. Добавив рекламку и простенькую обучашку, я атаковал великий и ужасный App Store (эй, чего так дорого-то? Это только за год?!)
Империя соблазна наносит ответный удар
Я долго к этому подводил, и вот итог — я опять обоср опростоволосился. Игра не взлетела, я ее еле-еле нашел где-то в районе 200 места, где она и по сей день находится (выложил я ее в начале ноября). Я не понимаю, что не так — почему какие-то непонятные приложения с радиостанциями (94.7 с какими-то буквами, не помню), с играми, в которых нет числа 94, а только либо 9, либо 4, выше, чем моя игра. Видимо я ошибся в том плане, что результаты поиска выстраиваются не по совпадению в имени, а по количеству скачиваний, хотя это бред, если я ищу 94, значит мне не нужны “Угадай слово” или “IQ тест”. Обидно, но думаю, что тут нужно достаточно глубоко понимать процесс ранжирования игр в магазинах, а информации об этом не очень много (хотя может я плохо искал).
Как ни крути, но без сторонней помощи в продвижении, видимо, не обойтись. Мне интересно, много ли таких же программистов, столкнувшихся с проблемой продвижения при минимальном денежном запасе? Отсутствие денег убивает мотивацию продолжать что-то делать дальше, все равно о твоем продукте никто не узнает. Уже губу раскатал, что после выстрела игры на iOS начну пилить для Android, ну-ну.
Хоть и нелегка судьба инди-разработчика, есть и светлая сторона сего увлечения. За два года непрофессиональной разработки мобильных игр я узнал много интересного в работе операционных систем Android и iOS, особенности разработки под каждую из них, особенности работы с цифровой подписью и выкладыванием приложений в магазин (чувство после публикации твоей игры в каждом из магазинов просто непередаваемо). Один клон игры скачали 150 тысяч человек, второй 30 тысяч человек (да, я сделал два клона, плохие поступки приятнее совершать). Освоил, надеюсь, хотя бы на базовом уровне такие языки, как Lua, C# и Swift, в процессе разработки на последнем изучил многие паттерны проектирования, парочкой даже воспользовался для решения возникших задач. Хотя код по большей степени далеко не оптимальный, я сам чувствую, что скилл разработки поднялся, но развиваться есть куда. Приятный бонус в виде дополнительного заработка (монетизировал только с помощью рекламы).
Я думаю, мои неудачи связаны лишь с отсутствием денег, не более. Идей для разработки хватает, но пока я не разберусь с тонкостями продвижения и не найду эти пресловутые не пахнущие бумажки, не вижу смысла делать что-то новое.
Спасибо за внимание, помните самое главное — лучше попробовать, и пожалеть, чем не попробовать, и пожалеть еще больше. Дерзайте, все в ваших руках, если вы ждете знака начать что-то делать — то вот он, вперед!