JavaRush /Java блог /Random UA /На початку був JavaRush
Марат Каджаев
20 рівень
Санкт-Петербург

На початку був JavaRush

Стаття з групи Random UA
Мій перший випробувальний термін закінчився ще 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 (тепер я знав як він працює), БД, структури даних. Потім співрозмовник попросив розшарувати екран та написати калькулятор. Я від щастя мало не скрикнув, бо писав калькулятор за тиждень до цього. Впевнений у собі я приступив до завдання, чи то від хвилювання, чи ще чомусь я забув частину алгоритму. Екран розлючений - лізти в гугл страшно. Благо був мобільник, який врятував мою дупу. Наступного дня покликали на очну співбесіду і ще за кілька днів я отримав оффер.
На початку був JavaRush.
Робота була не офіційною, я був у ролі підмайстра в індивідуального підприємця. Писали ми сервіс для створення заходів, продажу квитків і таке інше. Пам'ятаю свій перший робочий день – ІП хвабон 15 пояснював, що треба зробити. - Ну як, все ясно? - Запитав ІП - Ммм, не зовсім, можна ще разок? - Дико хвилюючись попросив я. ІП пояснив ще раз. - Тепер зрозуміло? - Зараз так. Насправді я не зрозумів НІ-ЧЕР-ТА. Але попросити пояснити знову побоявся - думаю всі, хто працевлаштувався, зрозуміють мене. Суть завдання була в тому, щоб переписати з thymeleaf на AngularJS. На своє щастя, я знайшов частину готового коду і зробив також. Як воно працювало, я тоді не зрозумів, але з тугою впорався. Потім пішли завдання пов'язані безпосередньо з backend частиною. Тільки після практичного досвіду зі Spring я почав розуміти, що було написано в книзі "Spring для професіоналів". Пропрацював я там 8 місяців після чого переїхав до іншого міста, де досить швидко офіційно працевлаштувався, відпрацював 2 роки, попутно змінивши плашку з "Junior" на "Middle". Зараз я зіткнувся з тим, що робота перетворилася на рутину і не приносить жодної краплі задоволення. Тому зараз я взяв перерву, а щоб за час перерви не атрофувалися пальці вирішив спробувати іншу сферу — геймдев. А саме мобільний геймдев, спочатку Android, т.к. знаю джаву. Про це зараз і розповім у подробицях. Про нас У короткий термін зібралася невелика команда з 4-х осіб (включаючи мене): розробники 2шт, геймдизайнер 1шт, звукар 1шт. Т.к. досвіду у сфері геймдева ні в кого в команді не було і час мого відпочинку обмежено вирішабо реалізувати нескладний проект, який доведемо до кінця. Такі довели! Спочатку дедлайн був 15 листопада, але, як відомо, закінчити проект у встановлений термін — гріх. Тому ми його закінчабо на два тижні пізніше. За тими. стеку це: Java 8 і libGDX.

Про розробку

Початком розробки можна назвати 17 жовтня. Загалом ми витратабо 45 днів, за які:
  1. навчабося працювати з libGDX;
  2. написали код;
  3. намалювали графіку;
  4. зробабо музику;
У тих, хто вже бачив гру, може виникнути питання — чому так довго, гра ж проста? Так, це правда і якщо бути зовсім точним, то на саму розробку (написання коду) пішло від сабо півтора тижня. Решту часу можна поділити між:
  1. освоєнням двигуна;
  2. малюванням картинок, та був їх перемальовки;
  3. написання музики;
  4. пошуком звуків на https://freesound.org ;
  5. читанням купи статей про те, як просувати ігри
Плюс були моменти "простою" з різних причин - у когось іспит, у когось перескладання тощо. На "простий" можна сміливо віддати півтора тижні, а то й більше. Ще частина часу пішла на "дебати": ідеї про те, що додати в гру приходабо майже кожен день, тому були суперечки про те, що "це буде зайвим", "це не впишеться" і т.п. Таким чином ми відмовабося від багатьох ідей, наприклад додати тарганів, що бігають, яких можна тиснути і отримувати за це дод. окуляри: На початку був JavaRush - 2Взагалі, одна з найскладніших речей, на мій погляд, це визначитися заздалегідь з тим, що буде в грі і дотримуватися цього плану, не намагаючись додати ще одну фічу. Ось так і набралися ці 45 днів. Прототип гри був готовий через півтора тижні. У цей період графіки у нас до ладу ще не було, тому щось ми взяли з відкритого доступу (наприклад, фоновий аркуш паперу ми позичабо в Doodle Jump), щось самі накидали в паїнті. На початку був JavaRush - 3Гра технічно дуже проста - нам навіть не потрібно було використовувати box2d (фіз. двигун), обробити колізії та обчислити гіпотенузу можна і самостійно. З найцікавіших моментів виокремлю наступні.
  1. Спочатку у грі всі елементи генерувалися рандомно. Тобто. у нас є провайдери чорних дірок, ножиць, сюрикенів, стрижнів, сердець - суємо їх у масив, і потім беремо рандомний провайдер і отримуємо елемент із рандомними координатами. Досить швидко стало зрозуміло, що цей підхід "дуже не дуже", те саме нам сказали знайомі, які брали участь у тестуванні і порадабо використовувати шаблони. Напевно тим, хто займається геймдевом це очевидним рішенням, але т.к. ми в цій сфері новачки для нас це була дуже слушна порада.

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

    На початку був JavaRush - 4

    З шаблонами стало приємніше, але надто передбачувано, чи що. Тому ще одним шаблоном став той самий рандом. Тобто. тепер у нас є "статичні" шаблони та один рандомний. (Тут мем про ідеальний баланс).

  2. Основною проблемою, з якою ми зіткнулися, була ось у чому. LibGDX у нескінченному циклі викликає метод render(float delta), у якому власне і відбувається все відмальовування елементів. Лінія олівця у нас малюється так: ми беремо координати пальця і ​​поміщаємо туди текстуру. Так от, якщо ми вели пальцем по екрану дуже швидко, то утворювалися "дірки", тому що ми потрапляли в ті мілісекунди, коли метод render(delta) вже відпрацював і ще не зголосився знову. Проблему вирішабо досить просто — запам'ятовуємо останню координату, в якій відмалювали текстуру, отримуємо наступну і якщо відстань між ними більша за X і палець при цьому не відпускався — заповнюємо цей проміжок. Спочатку думали, що цей варіант може не спрацювати — лінії будуть незграбними, але побоювання були марними — все працює як слід.

    Власне, про гру

    Ігровий процес не претендує на унікальність, але цілком непоганий та здатний затягнути. Ви керуєте олівцем, буквально малюєте на папері ухиляючись від перешкод - ножиць, сюрікенів, чорних дірок. При цьому стрижень олівця закінчується і треба підбирати маленькі олівці. На випадок, коли стрижень добігає кінця, а олівців все ні можна підібрати уламок дзеркала. Він дасть ефект на кілька секунд – замість витрати стрижень відновлюватиметься, але при цьому керування стає дзеркальним – ведете вліво, а олівець малює вправо. Ще можна підібрати серце, яке дозволить раз зіштовхнутися з перешкодою і залишитися в живих. Чим довше вести не відриваючи палець від екрану, тим вище буде комбо, яке збільшує швидкість набору очок. Плюс поступово збільшується швидкість гри. Хіба що коровані грабувати не можна. На початку був JavaRush - 5Спочатку гру ми планували назвати Karan Dash (олівець, ахах, зрозуміли так?), але пізніше передумали та зупинабося на Pencil Dash. Мотивацією стало те, що ця витончена (ящетаю) гра слів буде зрозуміла лише російськомовній аудиторії. Гра ми випустабо пару днів тому і зараз займаємося просуванням. У цьому досвіду теж ні в кого в команді немає, всі знання про просування ми отримали з різних статей. Опублікували інформацію про гру на різних сайтах\форумах безкоштовно. З платних же каналів замовабо рекламу на 4пда, в одного блогера, кілька постів у пабликах ВК та AdMob. До речі, цей пост теж є частиною просування, тому з дозволу адміністрації залишаю тут посилання на гру. Сторінка гри в Google Play: клац Також залишу посилання на нашу групу ВК, там можна залишити відгуки\побажання і не пропустити оновлення клац Буду вдячний, якщо встановите (а раптом сподобається?), а за відгук з рейтингом обіцяю поставити свічку за ваше здоров'я! Ставте запитання, якщо є — відповім.На початку був JavaRush - 6

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ