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

    Про дизайн


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

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


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

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

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

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

    UPD:Активные и новые пользователи за последний месяц.



    UPD2:
    Аналитика показывающая, что добавление переводов даёт плюс
    Вот аналитика, которая сравнивает два месяца — месяц до добавления переводов в описания на Google Play и месяц после.
    Можно видеть, что верхний кружок справа стал более цветастым (появились пользователи с языками которых раньше не было).
    Так же можно видеть, что доли русских и американцев поуменьшились (в процентном соотношении). А доля англичан, наоборот — увеличилась. (вероятно за счёт того что в английском языке крестики-нолики называются «Noughts and Crosses»)
    Ещё можно увидеть в циферках — что в Греции, Болгарии и Италии вообще не было пользователей, а тут появились.

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 24

      +1
      Хотелось бы узнать, что происходит с закачками и активными пользователями в итоге. Про локализацию, насколько эффективнее человеческий перевод по сравнению с машинным?
        0
        Новых пользователей в день: 15
        Активных пользователей в день: 45
        (приблизительно, чтобы порядок был понятен)

        Про локализацию человеком — пока сказать не могу, добавил перевод на португальский только позавчера, достаточной статистики ещё нет.
          0
          Приложили бы пару графиков из Google Play, было бы понятнее.
            +2
            Это мне не сложно, добавил в пост.
              0
              1. Серые вешки это релизы?
              2. Каким образом гп подсчитывает активных пользователей? Если, например, приложению не требуется интернет?..
                +1
                1. Серые вершки — релизы да.
                2. Google Play не подсчитывает активных пользователей, их подсчитывает Google Analytics, который теперь можно привязать к Google Play. Я, честно говоря, не знаю как он это может делать в случае, если приложению не требуется интернет (видимо аналитика просто не работает в данном случае). Но большинству приложений интернет требуется. Опять же моё предположение: если интернет отключен физически, то аналитика собранная на конкретном устройстве отсылается с запозданием.
                  0
                  2 из 5 обновлений привели к снижению, а не к увеличению установок, 1 никаких изменений не произвело… То ли пользователи — не водица, то ли труба не достроена ;)
                  Чем объясняется скачек к 80? XDA-эффект имел место? А хабраэффект получился ли?
                    0
                    Это не снижения и увеличения, это случайные флуктуации. Хабраэффект будет (если будет) виден сегодня к вечеру или завтра, данные довольно медленно обновляются в маркете.
                      0
                      Есть великая вещь — Google Analytics. Она обновляется в реальном времени (там даже есть вкладка где можно посмотреть всё про текущих активных пользователей).

                      Так вот, хабра-эффекта не будет (совсем).

                      И причин я тут вижу несколько:

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

                    Но я в пост добавил немного циферок и скриншот из Google Analitycs, чтобы вы могли посмотреть как изменилось количество новых пользователей после добавления переводов.

                    Скачек к 80ти объясняется просто — это была небольшая рекламная компания :)
                    XDA эффекта кстати не было.
                    4pda — выкладывал на форуме и за месяц в целом получил около 100 загрузок.

                    Про хабра-эффект отвечу другому товарищу (выше).
                    А про трубу — пока что ощущение что я строю её где-то не там ;) Или действительно не достроил.
                      0
                      Подписался, жду продолжения.
        0
        Финансовый вопрос, плиз.
          +3
          Что конкретно вас интересует?

          Если то, откуда брать деньги на эти 4ре месяца работы, то я делал это всё вечерами/выходными и за свой счёт (работаю C++ программистом удаленно).

          Если монетизация — то с 15 пользователей в день много не поимеешь. Реклама приносит порядка 2$ в месяц. В игре есть ещё бонусы (медальки выдаются и очки начисляются) за большое количество сыгранных игр — я думал продавать эти медальки в качестве InApp, ну или хотя бы попробовать это делать. Но опять же, пока вопрос с количеством пользователей не решится — особого смысла делать это я не вижу.

          P.S. Ник у вас подходящий для подобных вопросов :)
          0
          Спасибо за статью)) мне такой опыт как раз кстати… Только на iOS
            0
            Пожалуйста!
            Думаю на iOS всё должно быть похоже (что касается SEO).

            А что касается статьи — статья клёвая получилась, да.

            Но вот я думаю стоило ли её писать:

            хабра-эффект вылился всего в 15 новых пользователей,
            судя по-всему «конкуренты» ринулись использовать предложенное SEO-кунгфу,
            поскольку по запросу «крестики нолики» я опустился на 10 позиций, что тоже не особо радует,
            обсуждения интересного (с предложениями и прочим) тоже как-то не получилось.

            Но, как говорится, что нас не убивает — делает нас сильнее :)

              +1
              У меня яблофон, я был бы 16..))
              Подумайте о «зеленых» новичках, кому вы подарили 4 месяца человеческой жизни)
                +2
                Спасибо за поддержку!
                Про новичков да — вы правы.
                Я ещё думаю, что в целом SEO-кунгфу могли воспользоваться многие русские разработчики не связанные с «крестиками-ноликами», а это считай Родине помог :)
            0
            А зачем возможность «шарить» результат на Google disk и сканер штрихкодов?
              0
              Это стандартное окно Android в котором показывается список приложений, которые готовы принять ваши данные (гуглить Intent.ACTION_SEND).
              Теоретически наверное можно как-то пронаследоваться от этого интента (но я не уверен) и как-то повлиять на список приложений, которые там покаызваются и ограничить его Фейсбуком и Вконтактиком допустим, но кто знает какие социальные сети используют в Китае, или кто знает не появится ли завтра новое приложение для Фейсбука. Поэтому проще пока что так — предлагать шарить и на «утюги» тоже :)
                0
                Точно! Извините за ламерский вопрос, я проверил еще в нескольких приложениях они тоже предлагают шарить на «утюги», так что это, судя по всему, стандарт.
                  0
                  Да ничего страшного, вдруг кто-нибудь прочитает ваш комментарий и возьмёт да и предложит какое-нибудь неожиданное решение данному недочету. Опять же мне очень приятно, что вы запустили приложение и даже тыкнули в кнопку, в которую редко кто тыкает. Ну и наконец теперь мы все знаем, что у вас установлен Google Drive и сканер штрихкодов :)

            Only users with full accounts can post comments. Log in, please.