Про мой опыт разработки под Android или тренируемся на Крестиках-Ноликах

в 15:48, , рубрики: android, DIY, mobile development, дизайн, крестики-нолики, мотивация, Разработка под android, метки: , , , ,

Про мой опыт разработки под Android или тренируемся на Крестиках Ноликах

  • Мой опыт: 4ре рабочих месяца (реально это растянулось на полтора года)
  • Уровень подготовки читателя: новичок
  • Темы о которых я попытаюсь рассказать в этой статье: как я к этому пришёл, мотивация, как сделать простой дизайн самому, немного про SEO в Google Play и одна затерявшаяся среди этого всего мысль про локализацию.

Здравствуйте, меня зовут %username и я тоже пишу мобильные игры

Всё началось с Unigine Open Air 2012, я туда поехал с друзьями пишущими игры надеясь просто хорошо провести время (провёл), но когда вокруг алкоголики, виски, шашлыки люди увлеченные написанием игр — сложно удержаться и не попробовать. Второй причиной было то, что у меня есть два приятеля, которые успешно написали что-то своё и теперь потихоньку работают на себя. Тут я решил, что “все прыгали и я прыгну, мне то чё” ©. И понеслось.

Суперплан

План выработался практически сразу:

  1. Пишем самую простую игру, выкладываем её в маркет, развлекаемся (кодим, рисуем, переводим, оптимизируем, добавляем социализацию).
  2. Берем опыт (и немного кода) из предыдущего пункта, переписываем геймплей — и вуаля у нас другая игра.
  3. ...
  4. С пунктом после троеточия всем всё ясно. :)

В данный момент я где-то в конце первого пункта. Но меня никак не отпускает и постоянно хочется что-нибудь ещё немножко вот тут дописать, дорисовать, поменять.

В качестве запасного варианта к плану я решил, что такой опыт лишним в любом случае не будет.

Дзен и мотивация

Мотивация странная штука, у всех она своя. Но мне кажется общая суть мотивации в том, что если вы можете обмануть себя (обманывать других — нехорошо, а себя — самое оно!) и объяснить почему нужно потратить этот солнечный день на кодинг вместо катания на велосипеде — обманывайте! Даже если объяснение далеко от логики — это не беда :)

Про то, откуда брать время

Смотрите, если позволить себе пилить своё приложение по субботам, вот каждую субботу 8мь часов целенаправленно садиться и делать! То получается что в год у вас 52 рабочих дня набежит. А это уже 2.5 рабочих месяца! Давайте предположим, что мы ещё немножко вечерами думаем про приложение и архитектуру и увеличим это время до 3.5 месяцев в год. Уже неплохо, а теперь финт ушами и подумаем о том, на сколко мы продуктивны когда пишем своё приложение и когда работаем на дядю? Оооок, какой у вас коэффициент получился? 1? 1.5? а может все 2?

Про трубу (или куда тратить время)

Представьте, что ваши пользователи — вода, которая течет по трубе. А ваша цель сделать так, чтобы через трубу протекало как можно больше воды. И, допустим, каждое улучшение, которое вы делаете, даёт вам увеличение этого потока на 10% (что вполне реально, допустим одно улучшение — один рабочий день). Так вот, есть у нас в начале 1 пользователь в день, а мы хотим 1000, спрашивается сколько улучшений нужно сделать всего? 1,1^x = 1000, итого x — 72 улучшения за 72 рабочих дня. (вот наши 3.5 месяца и пригодились).

А всякие неудачи — вроде улучшил проект, а 10% не выиграл, можно объяснять тем, что труба имеет куски разных диаметров, и возможно вы улучшили не самое узкое место. Или почему совсем нет пользователей — так ты трубу не достроил, какие тебе пользователи? Во всех отношениях приятная модель для самообмана.

Про общение

Очень важно найти кого-то кто будет вас подбадривать и кто тоже увлечен этой же темой (мобильной разработкой). У меня под боком сидит товарищ, который успешно пилит свои игры, и с которым мы часто обсуждаем самые разнообразные странные вещи которые узнаём про платформу, про психологию пользователей и прочее. Это очень сильно помогает не забросить это увлечение.

Про ошибку выжившего

Помните про неё. Читайте не только success story, но и просто отчёты вроде моего, и тем более — отчеты товарищей которые провалились. И только тогда делайте выводы.

Про приложения за пару вечеров

Я часто слышу про “приложение на коленке за пару вечеров” и это очень демотивирует. Я не знаю таких людей лично, но знаю других, которые потратили много месяцев, прежде чем приложение начало приносить нормальные деньги. Это меня мотивирует. (учитывая, что потратил я уже около 4х месяцев).

Про покупку иконки

Я жоплюсь тратить деньги (тем более, что я ничего особенно не жду от тестового проекта). Это странная штука, когда ты потратил дофига времени которое стоит кучу денег (ну ладно, опыт всё-таки получил взамен), но не можешь купить иконку или перевод или заказать дизайн. Если у вас есть такая фигня — нужно с ней бороться, ну или хотя бы как-то учитывать. Это не дело, когда вы рисуете убогую иконку тратя на это больше времени (и денег в его эквиваленте), чем если бы вы заказали иконку у дизайнера. Вообще, разработка приложения похожа на игру. В игре, важно заставить игрока сделать маленькую покупку как можно раньше, потому что как только пользователь сделает хоть одну покупку он будет тратить деньги намного легче. Так и тут, купите иконку, а дальше будет легче.

Все люди разные опять же, кто-то вбухивает дофига своего времени, кто-то денег.

P.S. Многие мысли вроде этих приходили в голову как некое просветление — потому я и назвал эту часть статьи “дзен и мотивация”.

Про дизайн

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

Про мой опыт разработки под Android или тренируемся на Крестиках Ноликах

  • Для начала гуглим картинки по теме и находим какую-нибудь в нескольких цветах, которая нам нравится.
  • Берем из неё набор цветов (желательно чтобы цветов было не много).
  • Поскольку рисовать мы не умеем (как минимум я не умею) — плоский дизайн это наш выбор.
  • Поначалу я думал найти какой-нибудь векторный редактор, чтобы всё в нём рисовать, а потом уже экспортить в png и использовать в приложении. В итоге оказалось, что мне вполне достаточно документа “Рисунок” в google docs и соответственно его возможностей работы с векторными объектами (привет товарищу который нарисовал дизайн iOS 7 в Wordе) — там как раз оказался объект похожий на бублик (нолик) и векторный знак умножения (крестик). Кнопка тоже была нарисована вначале в этом же редакторе и потом экспортнута в png.

Вот что получилось:
Про мой опыт разработки под Android или тренируемся на Крестиках НоликахПро мой опыт разработки под Android или тренируемся на Крестиках НоликахПро мой опыт разработки под Android или тренируемся на Крестиках НоликахПро мой опыт разработки под Android или тренируемся на Крестиках НоликахПро мой опыт разработки под Android или тренируемся на Крестиках Ноликах

Текстура фона тоже рисовалась в google docs, а потом множилась и поворачивалась в Paint.NET.
В итоге получилось нечто такое:
Про мой опыт разработки под Android или тренируемся на Крестиках НоликахПро мой опыт разработки под Android или тренируемся на Крестиках Ноликах
Оба варианта на мой неискушенный взгляд оказались вполне приемлемыми. Чего и вам желаю.

Замечание по поводу кнопки ещё такое — чуть позже я узнал, что всё-таки android позволяет рисовать немного векторных объектов нативно — они называются Shape и позволяют нарисовать вот как раз такую кнопку с закругленными краями, границей и даже градиентом. Создаёте такой Shape в папке drawable, а потом используете в качестве фона у кнопок или других объектов.

Анимация

Чтобы было чуть-чуть интереснее — на каждый ход я сделал анимацию (тоже нативная штука в android).

Эффекты следующие:

  • проявление (смена альфы от полностью прозрачного до непрозрачного),
  • появление (ресайз из точки в крестик или нолик),
  • поворот вокруг оси (вертикальной или горизонтальной — ресайз по одной оси до нуля с центром в центре симметрии крестика или нолика потом обратный ресайз),
  • поворот вокруг центра (только для крестика).

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

Добавляем файл overx.xml в res/anim папку проекта со следующим содержанием:

<set xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/linear_interpolator">
   <scale
       android:fromXScale="1.0"
       android:toXScale="0.0"
       android:fromYScale="1.0"
       android:toYScale="1.0"
       android:pivotX="50%"
       android:pivotY="50%"
       android:duration="125"
       android:repeatCount="1"
       android:repeatMode="reverse"
  	></scale>
</set>
  • pivot — означает центральную точку относительно которой производится scale
  • repeatCount — 1 — означает, что анимация выполнится один раз и после этого будет 1 повтор
  • repeatMode — reverse — означает что повторная анимация будет выполнена в обратном порядке — то есть вернет все изменения сделанные первоначальной анимацией обратно

Надеюсь остальные параметры совсем не вызовут вопросов.

Вызов непосредственно этой анимации происходит так:

Button button = (Button)findViewById(R.id.button);
Animation anim = AnimationUtils.loadAnimation(this, R.anim.overx);
button.startAnimation(anim);

Я создал пул анимаций для крестиков и для ноликов отдельно и использовал их в случайном порядке. Так вот выяснилось, что не стоит использовать один и тот же объект Animation для анимации разных изображений. Для меня это как-то оказалось неочевидным. И я поимел немного непонятных проблем.

Иконка

Иконка — очень важна (но я от смены иконок изменения количества скачек не заметил).
Эволюция иконки:
Про мой опыт разработки под Android или тренируемся на Крестиках НоликахРисуется в любом редакторе :)

Про мой опыт разработки под Android или тренируемся на Крестиках НоликахЛюбой редактор + вот такой генератор кнопочек (там свои ограничения, но вполне себе пользуемо).

Про мой опыт разработки под Android или тренируемся на Крестиках НоликахВот у этих товарищей есть триальный 3d редактор. Можно было конечно 3ds Max, но мне показалось что дольше буду разбираться.

Про мой опыт разработки под Android или тренируемся на Крестиках НоликахБыла мысль, что выделюсь черным фоном и мою иконку заметят… но нет :)

Про мой опыт разработки под Android или тренируемся на Крестиках Ноликах Тут произошли кардинальные изменения в приложении. Ачивки были убраны и вместо них появилась система подсчета рейтинга (что символизирует кубок) на основе скорости реакции игрока и таблица рекордов. Я нашёл другой редактор иконок, в котором больше возможностей делать всякие впуклые иконки и прочее, но в итоге иконка такая же по выпуклостям как и была на второй картинке.

Про мой опыт разработки под Android или тренируемся на Крестиках НоликахВсё-таки плоский дизайн.

Про локализацию

Похоже времена когда достаточно было сделать перевод приложения на корейский, чтобы его начали бешенно качать прошли (по крайней мере для крестиков-ноликов). Я думаю это потому, что раньше был шанс практически сразу по запросу оказаться одним из первых — сейчас уже нет.

Вся одна полезная мысль про локализацию у меня такая: идём на xda developers форум, мониторим ветку где выкладывают свои приложения разработчики и пишем им мол, давай я твоё приложение переведу на русский, а ты моё — на свой родной язык. Но нужно конечно вначале прикинуть, чтобы не оказалось что переводить чужое приложение придется день, а у вас всего пару строчек для перевода. Я написал 6ым, откликнулись 2ое, перевод пока что мы сделали так только с одним товарищем, опыт вполне приятный, даже не смотря на то, что мне пришлось раза в три больше перевести чем товарищу. Но с другой стороны — одним хорошим приложением больше в русском маркете.

Про SEO

Всё что ниже будет оnноситься не к топам, а к поиску по ключевому слову “Крестики нолики”.

Так как же подняться повыше?

  • В первую очередь на положение влияет количество скачек.
  • Звездочки тоже как-то влияют, но я пока не понял как. Я думаю как минимум пользователи будут неохотно качать приложение с низким рейтингом. Чтобы получить звёздочки — делаем напоминание пользователям в приложении порейтить и переход в Google Play.
  • Самое интересное — название приложения. Тут поподробнее.
    1. При прочих равных “Крестики нолики” по запросу “Крестики нолики” будет выше чем “Крестики нолики онлайн”. Даже больше, если у вас приложение называется “Крестики нолики” вы обойдете многих товарищей даже с бОльшим количеством скачек.
    2. Google Play подсказывает после набора “Крестики нолики” в поиске другие популярные варианты, например “Крестики нолики онлайн”, можно назваться именно так, если у вас действительно онлайн версия и вы находитесь высоко по этому запросу (если смените название), тогда есть возможность что этот трафик придет к вам. И он может быть больше текущего.
    3. Нет смысла называться “Крестики-Нолики (Tic Tac Toe)” потому что таким образом вы будете не достаточно высоко по запросу “Крестики-Нолики” и недостаточно высоко по “Tic Tac Toe”. В этом случае лучше в русском описании оставить “Крестики-Нолики” а в английском “Tic Tac Toe”, тогда независимо от того какой язык у вас выбран вы будете выше и по запросу “Крестики-Нолики” и по “Tic Tac Toe”.
    4. Можно поэкспериментировать и в русском названии написать “Крестики-Нолики” а в каком-нибудь тайском “Крестики-Нолики онлайн”, да-да по-русски. Тогда вы будете достаточно высоко в русском поиске по “крестики-нолики” а так же по “крестики-нолики онлайн”. Но это так, мысли для размышления.
    5. Название приложения имеет высокий приоритет при ранжировании по ключевым словам. Даже не так, название приложения в любой локализации имеет приоритет перед описанием в любой локализации.
    6. Но описание тоже важно, так, добавление в описание слов “Крестики-Нолики” несколько раз позволяет подняться на пару-тройку позиций, но это конечно зависит от приложений которые располагаются непосредственно рядом с вами в поиске.
    7. Про переводы на разные языки — пользователи других стран не пишут “Крестики-нолики” они пишут самые разнообразные буковки, которые нам нужно как-то узнать. Традиционный способ — открыть википедию и посмотреть названия в разных локализациях (гугл транслэйт ошибется — википедия — нет). Для крестиков-ноликов я нашёл чудесную статью на белорусском в которой написаны переводы на многие языки. (Оттуда я узнал происхождение чудесного слова “крыжик” которое обозначает checkbox и которое я считал сленгом). Так вот, по запросу “tic tac toe” вы можете по-началу быть далеко за 100 местом, а вот по запросу “Крыжыкі-нулікі” всё может быть совсем по-другому :). Но это если вы добавите описание на белорусском (гугл-траслэйт привет) и название на белорусском. Гугл транслэйт не очень конечно хорошо, но в итоге добавив порядка 10-15 языков (и главное локализованных названий) стало приходить чуть больше пользователей (процентов на 10-20) и стали приходить те, кого раньше совсем небыло.
    8. Да, в Google Play описания и названия приложений обновляются около часа-двух. Но индекс для поиска обновляется мгновенно. То есть вы в описании меняете название на какое-нибудь другое, сохраняете, и уже можете попробовать поискать по ключевому слову своё приложение в Google Play и тут же оценить его позицию.

И ещё пара замечаний относительно SEO

Я пробовал добавлять локализованные названия в само приложение в надежде что это как-то поменяет позицию в поиске, но увы нет. (я так предположил потому, что гугл плэй даёт подсказки что мол надо бы перевести само приложение на такой-то язык, а значит, возможно, парсит файлы локализации приложения).

Приложения-новички (меньше месяца в маркете) рискуют попасть в топ новых, так что если вы уверены, что приложение прямо может выстрелить — лучше чуть подождать с выкладыванием и выстрелить. Я, понятное дело, ни о чём таком не думал и считаю что в большинстве случаев неторопливой разработки (инди) гораздо важнее фидбек, чтобы не забросить это всё дело окончательно. Поэтому моя первая версия выглядела очень убого :)

И напоследок

Когда я собирался только писать статью — я думал, что это будет нечто всеобъемлющее полностью раскрывающее всё, что со мной произошло за последний год, но мне кажется, что я уже утомил читателей своими буковками, да и сам уже подустал. Поэтому я решил, что опишу только некоторые вещи касающиеся разработки приложения, а само программирование оставлю для возможной второй части.

Анонс сиквела будет примерно таким:

  • работа с аналитикой,
  • разные рекламные сети,
  • Crashlytics,
  • обфускация кода (proguard),
  • реализация таблицы рекордов (ох, слишком тяжелый таск оказался),
  • выбор метрики оценки рекорда игрока (сейчас это скорость реакции игрока за последние 15 игр, но у меня было несколько вариантов и я до сих пор не уверен, что этот идеальный),
  • защита локально хранящихся данных шифрованием,
  • и простая защита от чита в таблице рекордов.
  • Могу так же рассказать про расшаривание рекордов игроков с сылкой на сайт игры, но игроки как-то неохотно шарят рекорды.

Остальное добавить по-вкусу.
Если есть пожелания к сиквелу или вопросы или лучше предложения что и как лучше сделать — я с удовольствием готов обсудить.

Автор: peshekhonov

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js