CodeGym/Java блог/Случаен/В началото имаше...
John Squirrels
Ниво
San Francisco

В началото имаше...

Публикувано в групата
В началото имаше ... - 1 Изпитателният ми срок за първата ми работа приключи преди 3 години, но чак сега намерих време да напиша статия. Прекарах една година в различни отдели в моя университет: през първия си семестър учих мениджмънт, а през втория семестър преминах към софтуерно инженерство. Надявах се да ме научат да програмирам, но се обърках. И така, събрах материали и реших да науча всичко сам. Единствената причина, поради която съм благодарен на учителя си е, че ми препоръча да започна с електронната книга на Стивън Прат „The C Programming Language“. Това наистина е добра книга с много практически упражнения. Прекарах около 2 месеца върху книгата, след което попаднах на този онлайн курс по Java в групи на приятел и така започна. Първоначално планирах да стана разработчик на Android, но бекендът ми изглеждаше по-интересен, докато напредвах в обучението си. Между другото, отне ми 3 месеца учене, за да достигна ниво 20, след което реших да опитам да си намеря работа. Първата задача беше да се преместя в друг градтъй като моята нямаше свободни места за младши Java разработчик. Намерих фирма, кандидатствах и получих тестова задача, за която ми беше дадена една седмица. Трябваше да напиша просто уеб приложение, използвайки Hibernate, Servlet/JSP и MySQL. Виждайки всички тези термини, знаех само, че MySQL е база данни. В началото бях много разочарован. Дори реших да търся свободни работни места в някой KFC, но след това реших да изпробвам тестовата задача. В крайна сметка винаги мога да си намеря работа в KFC. Работих без прекъсване цяла седмица и успях да завърша теста. Изпратих решението си, но то „не беше красиво“, така че го преработих още 4 пъти. Последното ми решение се оказа правилно, но позициите вече бяха заети и допълнителни кандиdateри нямаше да се приемат след 3 месеца. Какво ще правиш, нали? През следващите 3 месеца, Научих HTML, CSS, JS, SQL и PHP. Защо PHP? Имах нужда от сървърен език, който да отговаря на заявки и други подобни. По това време сървлетите и jsp изглеждаха твърде сложни. В крайна сметка създадох пълноценно уеб приложение с ужасен интерфейс. Публикувах codeа в GitHub за моето портфолио. До този момент минаха 3 месеца и същата компания отново се свърза с мен и ме покани на интервю, като ми даде още една лесна задача за проверка на знанията ми по SQL, която успях да изпълня за няколко часа. Човекът, с когото разговарях за работа, намекна, че ще пита за алгоритми и структури от данни - теми, които все още не бях имал време да овладея. Това каза, че имаше 15 дни преди интервюто. Разбрах това! Книгата на Робърт Лафоре „Структури на данни и алгоритми в Java“ ми помогна. аз не Нямах време да прочета и разбера всичко за две седмици, но все пак научих много. И тогава дойде денят на интервюто. Пристигнах в уречения час. Двама мъже ме поздравиха и интервюто започна. Да кажа, че се тревожех, би било грубо подценяване. Гласът ми трепереше. Питаха за всичко, освен за алгоритми и структури от данни. Питаха за Spring, DI, IoC, Hibernate, How работи JVM, How работи събирачът на боклук - не успях да отговоря на нито един от тези въпроси. Отговорих успешно само на въпроси относно Java Core (колекции, изключения, OOP и т.н.). Още докато бях на интервюто знаех, че съм се провалил, но все още бях разочарован, че не получих обратна връзка. Вместо това идентифицирах пропуски в знанията си и започнах да работя усърдно, за да ги запълня. И тогава дойде денят на интервюто. Пристигнах в уречения час. Двама мъже ме поздравиха и интервюто започна. Да кажа, че се тревожех, би било грубо подценяване. Гласът ми трепереше. Питаха за всичко, освен за алгоритми и структури от данни. Питаха за Spring, DI, IoC, Hibernate, How работи JVM, How работи събирачът на боклук - не успях да отговоря на нито един от тези въпроси. Отговорих успешно само на въпроси относно Java Core (колекции, изключения, OOP и т.н.). Още докато бях на интервюто знаех, че съм се провалил, но все още бях разочарован, че не получих обратна връзка. Вместо това идентифицирах пропуски в знанията си и започнах да работя усърдно, за да ги запълня. И тогава дойде денят на интервюто. Пристигнах в уречения час. Двама мъже ме поздравиха и интервюто започна. Да кажа, че се тревожех, би било грубо подценяване. Гласът ми трепереше. Питаха за всичко, освен за алгоритми и структури от данни. Питаха за Spring, DI, IoC, Hibernate, How работи JVM, How работи събирачът на боклук - не успях да отговоря на нито един от тези въпроси. Отговорих успешно само на въпроси относно Java Core (колекции, изключения, OOP и т.н.). Още докато бях на интервюто знаех, че съм се провалил, но все още бях разочарован, че не получих обратна връзка. Вместо това идентифицирах пропуски в знанията си и започнах да работя усърдно, за да ги запълня. Да кажа, че се тревожех, би било грубо подценяване. Гласът ми трепереше. Питаха за всичко, освен за алгоритми и структури от данни. Питаха за Spring, DI, IoC, Hibernate, How работи JVM, How работи събирачът на боклук - не успях да отговоря на нито един от тези въпроси. Отговорих успешно само на въпроси относно Java Core (колекции, изключения, OOP и т.н.). Още докато бях на интервюто знаех, че съм се провалил, но все още бях разочарован, че не получих обратна връзка. Вместо това идентифицирах пропуски в знанията си и започнах да работя усърдно, за да ги запълня. Да кажа, че се тревожех, би било грубо подценяване. Гласът ми трепереше. Питаха за всичко, освен за алгоритми и структури от данни. Питаха за Spring, DI, IoC, Hibernate, How работи JVM, How работи събирачът на боклук - не успях да отговоря на нито един от тези въпроси. Отговорих успешно само на въпроси относно Java Core (колекции, изключения, OOP и т.н.). Още докато бях на интервюто знаех, че съм се провалил, но все още бях разочарован, че не получих обратна връзка. Вместо това идентифицирах пропуски в знанията си и започнах да работя усърдно, за да ги запълня. Отговорих успешно само на въпроси относно Java Core (колекции, изключения, OOP и т.н.). Още докато бях на интервюто знаех, че съм се провалил, но все още бях разочарован, че не получих обратна връзка. Вместо това идентифицирах пропуски в знанията си и започнах да работя усърдно, за да ги запълня. Отговорих успешно само на въпроси относно Java Core (колекции, изключения, OOP и т.н.). Още докато бях на интервюто знаех, че съм се провалил, но все още бях разочарован, че не получих обратна връзка. Вместо това идентифицирах пропуски в знанията си и започнах да работя усърдно, за да ги запълня.Намерих работа един месец след неуспешното ми интервю. Между другото, открих свободното място в дискусии за CodeGym ( CodeGym е рускоезичната version на CodeGym — бележка на редактора). Първо имаше интервю по Skype с специалист по подбор на персонал (продължи около 2 часа). Питаха за Java Core, събиране на боклук (сега знаех How работи), бази данни и структури от данни. Интервюиращият ме помоли да споделя екрана си и да напиша калкулатор. Почти се разплаках от радост, тъй като само седмица преди това бях написал калкулатор. Уверен в себе си, започнах задачата. Но дали от вълнение or по друга причина, забравих част от алгоритъма. Моят екран беше споделен. Страхувах се да се консултирам с Google. За щастие имах мобилния си телефон, който ми спаси задника. На следващия ден ми се обадиха за лично интервю и няколко дни по-късно получих предложение. Това не беше официална позиция. Моята роля беше чирак на едноличен търговец. Написахме услуга за планиране на събития, продажба на билети и т.н. Спомням си първия си работен ден. Шефът ми отдели 15 minutesи, за да обясни Howво трябва да се направи. — Всичко ясно ли е? попита той. „Хм, не съвсем. Можеш ли да го прегледаш още веднъж?“ – попитах с голяма загриженост. Шефът отново обясни всичко. — Сега ясно ли е? — Да, сега е така. Всъщност НИЩО не разбрах. Но ме беше страх да поискам друго обяснение. Мисля, че всеки работещ може да разбере това. Задачата се свеждаше до пренасяне от Thymeleaf към AngularJS. За щастие намерих част от завършен code и го използвах като пример Howво да правя. Не разбрах How става, но завърших задачата. Впоследствие ми бяха възложени задачи, пряко свързани с бекенда. Едва след практически опит със Spring започнах да разбирам това, което прочетох в "Пролет за професионалисти". Работих там 8 месеца и след това се преместих в друг град, където бързо си намерих официална работа, работих 2 години и по пътя промених титлата си от "junior" на "midlevel". Тогава се сблъсках с факта, че работата ми се превърна в рутина и не ми доставяше и капка удоволствие. Така че си взех почивка. За да спра пръстите ми да атрофират по време на почивката ми, реших да опитам ръката си в друга област: разработката на игри. По-конкретно, разработка на мобилни игри, взимане на Android, тъй като вече познавах Java. И това е, за което сега ще говоря подробно. Едва след практически опит със Spring започнах да разбирам това, което прочетох в "Пролет за професионалисти". Работих там 8 месеца и след това се преместих в друг град, където бързо си намерих официална работа, работих 2 години и по пътя промених титлата си от "junior" на "midlevel". Тогава се сблъсках с факта, че работата ми се превърна в рутина и не ми доставяше и капка удоволствие. Така че си взех почивка. За да спра пръстите ми да атрофират по време на почивката ми, реших да опитам ръката си в друга област: разработката на игри. По-конкретно, разработка на мобилни игри, взимане на Android, тъй като вече познавах Java. И това е, за което сега ще говоря подробно. Едва след практически опит със Spring започнах да разбирам това, което прочетох в "Пролет за професионалисти". Работих там 8 месеца и след това се преместих в друг град, където бързо си намерих официална работа, работих 2 години и по пътя промених титлата си от "junior" на "midlevel". Тогава се сблъсках с факта, че работата ми се превърна в рутина и не ми доставяше и капка удоволствие. Така че си взех почивка. За да спра пръстите ми да атрофират по време на почивката ми, реших да опитам ръката си в друга област: разработката на игри. По-конкретно, разработка на мобилни игри, взимане на Android, тъй като вече познавах Java. И това е, за което сега ще говоря подробно. където бързо си намерих официална работа, работих 2 години и по пътя промених титлата си от "младши" на "среден". Тогава се сблъсках с факта, че работата ми се превърна в рутина и не ми доставяше и капка удоволствие. Така че си взех почивка. За да спра пръстите ми да атрофират по време на почивката ми, реших да опитам ръката си в друга област: разработката на игри. По-конкретно, разработка на мобилни игри, взимане на Android, тъй като вече познавах Java. И това е, за което сега ще говоря подробно. където бързо си намерих официална работа, работих 2 години и по пътя промених титлата си от "младши" на "среден". Тогава се сблъсках с факта, че работата ми се превърна в рутина и не ми доставяше и капка удоволствие. Така че си взех почивка. За да спра пръстите ми да атрофират по време на почивката ми, реших да опитам ръката си в друга област: разработката на игри. По-конкретно, разработка на мобилни игри, взимане на Android, тъй като вече познавах Java. И това е, за което сега ще говоря подробно. Реших да опитам ръката си в друга област: разработка на игри. По-конкретно, разработка на мобилни игри, взимане на Android, тъй като вече познавах Java. И това е, за което сега ще говоря подробно. Реших да опитам ръката си в друга област: разработка на игри. По-конкретно, разработка на мобилни игри, взимане на Android, тъй като вече познавах Java. И това е, за което сега ще говоря подробно.Моят отбор. В кратък срок успях да събера малък екип от 4 души (включително мен): 2 разработчици, 1 дизайнер на игри и 1 звуков инженер. Тъй като никой от екипа нямаше опит в разработката на игри и тъй като времето ми за ваканция беше ограничено, решихме да реализираме прост проект, който със сигурност ще успеем да завършим. И така направихме! Първоначално крайният срок беше 15 ноември, но Howто знаете, завършването на проект по график е просто грешно. И така, ние го завършихме с две седмици закъснение. Нашият технологичен стек се състоеше от Java 8 и libGDX.

развитие

Разработката започна на 17 октомври. Общо прекарахме 45 дни, през които:
  1. Научихме How да използваме libGDX.
  2. Написахме code.
  3. Създадохме графики.
  4. Създадохме музика.
Всеки, който е гледал играта, може да попита: "Защо отне толкова време? Играта е толкова проста." Да, това е вярно и за да бъдем точни, разработката (писането на codeа) отне около седмица и половина. Останалото време беше разделено между:
  1. Овладяване How да използвате двигателя на играта.
  2. Рисуване и преначертаване на произведения на изкуството.
  3. Писане на музика.
  4. Търсене на звуци на https://freesound.org .
  5. Четене на купища статии за това How да рекламирате игри.
Имахме и моменти на "престой" по различни причини: някой имаше изпит, друг имаше поправителен тест и т.н. Със сигурност можем да отдадем седмица и половина or повече на престоя. Отделихме време и за „дебати“: почти всеки ден се появяваха нови идеи Howво да добавим към играта, така че обсъждахме: „това е излишно“, „това няма да пасне“ и т.н. Изхвърлихме много идеи, например добавяне на бягащи хлебарки, които могат да бъдат смачкани, за да получите допълнителни точки: според мен едно от най-трудните неща беше да се реши предварително Howво ще има в играта и да се придържате към плана, без да се опитвате да добавите „само още една " особеност. Така се натрупаха тези 45 дни. Прототипът на играта беше готов след седмица и половина. През този период наистина нямахме ниHowви графики, В началото имаше ... - 2Играта е много проста в технически смисъл. Дори не беше необходимо да използваме box2d (физически двигател). Можем сами да се справим със сблъсъци и да изчислим хипотенузата. Най-интересните точки, които ще подчертая са:
  1. Първоначално всички елементи на играта бяха генерирани на случаен принцип. С други думи, поставяме доставчици (на черни дупки, ножици, нинджа звезди, молив, сърца) в масив, получаваме произволен доставчик, получаваме елемент с произволни координати. Доста бързо стана ясно, че този подход „наистина не е много добър“. Приятели, участващи в тестването, ни казаха същото, препоръчвайки използването на шаблони. За тези, които участват в разработването на игри, това вероятно е очевидно решение. Но тъй като бяхме новодошли в областта, това беше много практичен съвет за нас.

    Така създадохме няколко шаблона: долина от ножици; поводи за молив — страхотно е да ги събирате супер бързо (фъф, фъш, фъш с пръст); и още един шаблон, който не знам How да нарека — просто ще ви кажа How кръстихме класа в нашия code: StraightForwardPattern.

    В началото имаше ... - 3

    Тези шаблони го подобриха, но няHow си стана твърде предсказуем. Ето защо добавихме още един: произволен шаблон. С други думи, сега имаме няколко „статични“ шаблона и един случаен (вмъкнете „перфектно балансиран“ мем тук).

  2. Ето основния проблем, който срещнахме. LibGDX извиква метода render (float delta) в безкраен цикъл. Това е мястото, където са изчертани всички елементи. Линията с молив се изчертава по следния начин: получаваме координати на пръстите и рисуваме текстура там. Така че, ако преместим пръста си по екрана много бързо, тогава линията ще има "празнини" поради мorсекундите между извикванията на метода render(delta).

    Решението беше доста просто: помним последните координати, където е начертана текстурата, получаваме следващите координати и ако разстоянието между тях е повече от X и пръстът не е бил освободен, тогава запълваме празнината. Първоначално решихме, че тази опция може да не работи - линиите ще бъдат ъглови. Но страховете ни бяха неоснователни, всичко работеше точно Howто трябва.

Относно играта

Геймплеят не претендира да е уникален, но е доста добър и може да привлече потребителите. Вие управлявате молив, буквално рисувайки върху хартия и избягвайки препятствия - ножици, нинджа звезди и черни дупки. Междувременно поводът ви за молив свършва и трябва да вземете малки моливи. Ако моливът ви е към края си, преди да съберете малко молив, можете да вземете парче от огледало. За няколко секунди, instead of да консумира оловото на молива, то ще бъде възстановено, но в същото време контролите са огледални - ако пръстът ви се премести наляво, тогава моливът рисува надясно. Можете също така да вземете сърце, което ще ви позволи да ударите препятствие веднъж и да останете живи. Колкото по-дълго движите молива, без да вдигате пръста си, толкова по-висока е вашата комбинация, което означава, че ще натрупате точки по-бързо. В началото имаше ... - 4Скоростта на играта също се увеличава постепенно. Единственото нещо, което липсва, са ядосаните птици. Първоначално планирахме да кръстим играта Karan Dash (транслитерацията на руската дума за молив е karandash — ха! разбрахте?), но по-късно размислихме и се спряхме на Pencil Dash. Направихме това, защото тази изящна игра на думи би била разбрана само от рускоезична публика. Пуснахме играта преди няколко дни и сега я рекламираме. И тук никой от екипа няма опит. Натрупахме цялото си знание за промотирането на игри от различни статии. Публикувахме информация за играта на различни уебсайтове/форуми безплатно. Нашите платени канали включваха реклама на 4pd, реклама с един блогър, няколко публикации в публични групи във VKontakte и реклама в AdMob. Между другото, тази публикация също е част от нашата промоция, така че с разрешение от администрацията на уебсайта, включвам връзка към играта тук. Можете да намерите играта в Google Play тук . Ще бъда благодарен, ако го инсталирате (може би ще ви хареса!), а ако оставите оценка, обещавам да кръстя дете на вас! :) В началото имаше ... - 6
Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари