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

от автора

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


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

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

Суперплан

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

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

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

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

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

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

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

Смотрите, если позволить себе пилить своё приложение по субботам, вот каждую субботу 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. Многие мысли вроде этих приходили в голову как некое просветление — потому я и назвал эту часть статьи “дзен и мотивация”.

Про дизайн

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

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

Вот что получилось:

Текстура фона тоже рисовалась в google docs, а потом множилась и поворачивалась в Paint.NET.
В итоге получилось нечто такое:

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

Замечание по поводу кнопки ещё такое — чуть позже я узнал, что всё-таки 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 для анимации разных изображений. Для меня это как-то оказалось неочевидным. И я поимел немного непонятных проблем.

Иконка

Иконка — очень важна (но я от смены иконок изменения количества скачек не заметил).
Эволюция иконки:
Рисуется в любом редакторе 🙂

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

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

Была мысль, что выделюсь черным фоном и мою иконку заметят… но нет 🙂

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

Всё-таки плоский дизайн.


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

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

Вся одна полезная мысль про локализацию у меня такая: идём на 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 игр, но у меня было несколько вариантов и я до сих пор не уверен, что этот идеальный),
  • защита локально хранящихся данных шифрованием,
  • и простая защита от чита в таблице рекордов.
  • Могу так же рассказать про расшаривание рекордов игроков с сылкой на сайт игры, но игроки как-то неохотно шарят рекорды.

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

ссылка на оригинал статьи http://habrahabr.ru/post/200776/


Комментарии

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

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