Мой первый испытательный срок закончился еще 3 года назад, но время на написание статьи появилось только сейчас. В университете я провел 1 год на разных факультетах: первый семестр я учился на менеджера, во втором семестре перевелся на программную инженерию. Надеялся, что меня будут учить программировать, но ошибся, поэтому забрал документы и решил самостоятельно все осваивать. Единственное, за что я благодарен педагогу — за то, что тот посоветовал начать с книги Стивена Прата "Язык программирования С". Действительно хорошая книга с большим количеством практических задач. На книгу ушло примерно 2 месяца после чего я наткнулся на JR в группах у друга и понеслось. Сначала я планировал стать Android разработчиком, но в процессе обучения backend мне показался более интересным. На обучение, кстати, ушло 3 месяца, за которые я дошел до 20 уровня, после чего решил попробовать трудоустроиться. Первым делом я переехал в другой город, т.к. в моем не было вакансий младшего Java разработчика. Нашел компанию, откликнулся, получил тестовое задание, на выполнение которого дали неделю. Надо было написать несложное веб-приложение с использованием Hibernate, Servlet\JSP и MySQL. Из всех этих слов я знал только, что MySQL это база данных. Сперва сильно расстроился, даже решил поискать пока вакансии в каком-нибудь KFC, но потом все-таки решил попробовать выполнить ТЗ — в KFC всегда успею устроиться. Всю неделю в режиме нон-стоп делал тестовое и успел. Отправил решение, но оно было "некрасивым", поэтому переделывал его еще 4 раза. Последнее решение оказалось верным, но выяснилось, что разработчиков уже набрали и следующий набор будет через 3 месяца. Штош, ладно. Следующие 3 месяца я учил html, css, js, sql и php. Что тут делает PHP? Мне нужен был серверный язык, который бы отвечал на запросы и все такое — сервлеты и jsp мне показались слишком сложными на тот момент. По итогу получилось полноценное веб-приложение и ужасным, но интерфейсом, код которого я выложил на github для портфолио. Как раз к этому времени прошло 3 месяца и мне написали из той же компании и позвали на собеседование дав еще одно несложное тестовое задание на знание SQL, с которым справился за несколько часов. Человек, с которым я общался насчет работы намекнул, что будут спрашивать про алгоритмы и структуры данных — эту тему я еще не успел освоить, но до собеседования было 15 дней, хули нам — гонщикам. Мне помогла книга Роберта Лафоре "Структуры данных и алгоритмы в Java". Прочесть и понять её всю за две недели я не успел, но все равно узнал много нового. И вот наступил день собеседования, я приехал в назначенное время, меня встретили 2 мужика и начался собес. Сказать, что я волновался ничего не сказать, у меня даже голос дрожал. Спрашивали обо всем кроме алгоритмов и структур данных. Спрашивали про Spring, DI, IoC, Hibernate, о том как устроена JVM, как работает GC — я не ответил ни на один из этих вопросов. Справился только с вопросами о Java Core (коллекции, исключения, ооп и т.п.). Уже на собеседовании я понял, что провалил его, но все равно было обидно не получить никакого фидбека. Зато я выявил пробелы в знаниях и принялся усердно их закрывать. Работу я нашел спустя месяц после провалившегося собеседования. Кстати, на вакансию я наткнулся в обсуждениях JavaRush. Сперва было собеседование по скайпу с рекрутером (примерно 2 часа длилось). Спрашивали про Java Core, GC (теперь я знал как он работает), БД, структуры данных. Потом собеседующий попросил расшарить экран и написать калькулятор. Я от счастья чуть не вскрикнул, потому что писал калькулятор буквально за неделю до этого. Уверенный в себе я приступил к задаче, но то ли от волнения, то ли еще почему я забыл часть алгоритма. Экран расшарен — лезть в гугл страшно. Благо был мобильник, который спас мою жопу. На следующий день позвали на очное собеседование и еще через пару дней я получил оффер.
Работа была не официальной, я был в роли подмастерья у индивидуального предпринимателя. Писали мы сервис для создания мероприятий, продажи билетов и все такое. Помню свой первый рабочий день — ИП минут 15 объяснял, что нужно сделать. — Ну как, все ясно? — спросил ИП — Ммм, не совсем, можно еще разок? — дико волнуясь попросил я. ИП объяснил все еще раз. — Теперь ясно? — Теперь да. На самом деле я не понял НИ-ЧЕР-ТА. Но попросить объяснить снова побоялся — думаю все, кто трудоустроился поймут меня. Суть задачи была в том, чтобы переписать с thymeleaf на AngularJS. К своему счастью, я нашел часть готового кода и по примеру сделал также. Как оно работало я тогда не понял, но с таской справился. Потом пошли задачи связанные непосредственно с backend частью. Только после практического опыта со Spring`ом я начал понимать, что было написано в книге "Spring для профессионалов". Проработал я там 8 месяцев после чего переехал в другой город, где довольно быстро официально трудоустроился, отработал 2 года попутно сменив плашку с "Junior" на "Middle". Сейчас я столкнулся с тем, что работа превратилась в рутину и не доставляет ни капли удовольствия. Поэтому в данный момент я взял перерыв, а чтобы за время перерыва не атрофировались пальцы решил попробовать другую сферу — геймдев. А именно мобильный геймдев, для начала Android, т.к. знаю джаву. Об это сейчас и расскажу в подробностях. О нас В короткие сроки собралась небольшая команда из 4х человек (включая меня): разработчики 2шт, геймдизайнер 1шт, звукарь 1шт. Т.к. опыта в сфере геймдева ни у кого в команде не было и время моего отдыха ограничено решили реализовать несложный проект, который точно доведем до конца. Таки довели! Изначально дедлайн был 15 ноября, но, как известно, закончить проект в изначально установленный срок — грех. Поэтому мы его закончили двумя неделями позже. По тех. стеку это: Java 8 и libGDX. <h2>О разработке</h2>Началом разработки можно назвать 17 октября. В общей сложности мы потратили 45 дней, за которые:
  1. научились работать с libGDX;
  2. написали код;
  3. нарисовали графику;
  4. сделали музыку;
У тех, кто уже видел игру может возникнуть вопрос — почему так долго, игра же простая? Да, это правда и если быть совсем точным, то на саму разработку (написание кода) ушло от силы недели полторы. Остальное время можно поделить между:
  1. освоением движка;
  2. рисованием картинок, а потом их перерисовки;
  3. написание музыки;
  4. поиском звуков на https://freesound.org;
  5. чтением кучи статей о том, как продвигать игры
Плюс были моменты "простоя" по разным причинам — у кого-то экзамен, у кого-то пересдача и т.п. На "простой" можно смело отдать полторы недели, а то и больше. Ещё часть времени ушла на "дебаты": идеи о том, что добавить в игру приходили чуть ли не каждый день, поэтому были споры о том, что "это будет лишним", "это не впишется" и т.п. Таким образом мы отказались от многих идей, например добавить бегающих тараканов, которых можно давить и получать за это доп. очки: Вообще, одна из самых сложных вещей, на мой взгляд, это определиться заранее с тем, что будет в игре и придерживаться этого плана не пытаясь добавить "ещё одну" фичу. Вот таким образом и набрались эти 45 дней. Прототип игры был готов спустя полторы недели. В этот период графики у нас толком еще не было, поэтому что-то мы взяли из открытого доступа (например фоновый лист бумаги мы одолжили у Doodle Jump), что-то сами накидали в паинте. Игра технически очень простая — нам даже не нужно было использовать box2d (физ.движок), обработать коллизии и вычислить гипотенузу можно и самостоятельно. Из самых интересных моментов выделю следующие.
  1. Изначально в игре все элементы генерировались рандомно. Т.е. у нас есть провайдеры чёрных дыр, ножниц, сюрикенов, стержней, сердец — суем их в массив, и потом берем рандомный провайдер и получаем элемент с рандомными координатами. Довольно быстро стало ясно, что этот подход "очень не очень", то же самое нам сказали знакомые, которые принимали участие в тестировании и посоветовали использовать шаблоны. Наверняка для тех, кто занимается геймдевом это является очевидным решением, но т.к. мы в этой сфере новички для нас это был очень дельный совет.

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

    С шаблонами стало приятнее, но слишком предсказуемо, что ли. Поэтому ещё одним шаблоном стал тот самый рандом. Т.е. теперь у нас есть "статичные" шаблоны и один рандомный. (тут мем про идеальный баланс).


  2. Основной проблемой, с которой мы столкнулись была вот в чем. LibGDX в бесконечном цикле вызывает метод render(float delta), в котором собственно и происходит вся отрисовка элементов. Линия карандаша у нас рисуется следующим образом: мы берем координаты пальца и помещаем туда текстуру. Так вот, если мы вели пальцем по экрану очень быстро, то образовывались "дыры" потому что мы попадали в те милисекунды, когда метод render(delta) уже отработал и ещё не вызвался снова. Проблему решили довольно просто — запоминаем последнюю координату, в которой отрисовали текстуру, получаем следующую и если расстояние между ними больше X и палец при этом не отпускался — заполняем этот промежуток. Сначала думали, что этот вариант может не сработать — линии будут угловатыми, но опасения были напрасны — всё работает как надо. <h2>Собственно, об игре</h2>Игровой процесс не претендует на уникальность, но вполне неплох и способен затянуть. Вы управляете карандашом, буквально рисуете на бумаге уклоняясь от препятствий — ножниц, сюрикенов, чёрных дыр. При этом стержень карандаша кончается и надо подбирать маленькие карандашики. На случай, когда стержень подходит к концу, а карандашей всё нет можно подобрать осколок зеркала. Он даст эффект на несколько секунд — вместо траты стержень будет восстанавливаться, но при этом управление становится зеркальным — ведёте влево, а карандаш рисует вправо. Ещё можно подобрать сердечко, которое позволит разок столкнуться с препятствием и остаться в живых. Чем дольше вести не отрывая палец от экрана тем выше будет комбо, которое увеличивает скорость набора очков. Плюс постепенно увеличивается скорость игры. Разве что корованы грабить нельзя. Изначально игру мы планировали назвать Karan Dash (карандаш, ахах, поняли да?), но позже передумали и остановились на Pencil Dash. Мотивацией стало то, что эта изящная (ящетаю) игра слов будет понятна только русскоязычной аудитории. Игру мы выпустили пару дней назад и сейчас занимаемся продвижением. В этом опыта тоже ни у кого в команде нет, все знания о продвижении мы почерпнули из разных статей. Опубликовали информацию об игре на разных сайтах\форумах бесплатно. Из платных же каналов — заказали рекламу на 4пда, у одного блогера, несколько постов в пабликах ВК и AdMob. К слову данный пост тоже является частью продвижения, поэтому с разрешения администрации оставляю здесь ссылку на игру. Страница игры в Google Play: щёлк Также оставлю ссылку на нашу группу ВК, там можно оставить отзывы\пожелания и не пропустить обновление щёлк Буду благодарен, если установите (а вдруг понравится?), а за отзыв с рейтингом обещаю поставить свечку за ваше здоровье! Задавайте вопросы, если есть — отвечу.