I början var det ... - 1 Mitt första jobbs prövotid gick ut för 3 år sedan, men först nu hittade jag tid att skriva en artikel. Jag tillbringade ett år på olika avdelningar på mitt universitet: på min första termin studerade jag management och på min andra termin bytte jag till mjukvaruteknik. Jag hoppades att de skulle lära mig hur man programmerar, men jag hade fel. Så jag samlade material och bestämde mig för att lära mig allt på egen hand. Den enda anledningen till att jag är tacksam mot min lärare är att han rekommenderade att jag skulle börja med Stephen Pratts e-bok "The C Programming Language". Det är verkligen en bra bok med många praktiska övningar. Jag tillbringade ungefär 2 månader på boken, varefter jag stötte på den här online-Java-kursen i en väns grupper och så började det. Först planerade jag att bli Android-utvecklare, men backend verkade mer intressant för mig när jag gick framåt i mitt lärande. Förresten, det tog mig 3 månaders studier för att nå nivå 20, varefter jag bestämde mig för att försöka hitta ett jobb. Den första ordern var att flytta till en annan stadeftersom min inte hade några möjligheter för en junior Java-utvecklare. Jag hittade ett företag, sökte och fick en testuppgift som jag fick en vecka på mig att slutföra. Jag var tvungen att skriva en enkel webbapplikation med Hibernate, Servlet/JSP och MySQL. När jag såg alla dessa termer visste jag bara att MySQL var en databas. Först var jag väldigt besviken. Jag bestämde mig till och med för att leta efter lediga jobb på någon KFC, men sedan bestämde jag mig för att ta ett tag på testuppgiften. Jag kunde trots allt alltid få jobb på KFC. Jag jobbade oavbrutet hela veckan och lyckades göra klart provet. Jag skickade in min lösning, men den "var inte snygg", så jag reviderade den 4 gånger till. Min senaste lösning visade sig vara korrekt, men tjänsterna var redan tillsatta och ytterligare ansökningar skulle inte tas emot på 3 månader. Vad ska du göra, eller hur? Under de kommande 3 månaderna, Jag lärde mig HTML, CSS, JS, SQL och PHP. Varför PHP? Jag behövde ett serverspråk som skulle svara på förfrågningar och sådant. På den tiden verkade servlets och jsp för komplicerade. Till slut tog jag fram en fullfjädrad webbapplikation med ett fruktansvärt gränssnitt. Jag publicerade koden på GitHub för min portfölj. Vid det här laget hade det gått 3 månader och samma företag kontaktade mig igen och bjöd in mig till en intervju, vilket gav ytterligare en enkel uppgift för att testa mina kunskaper i SQL, som jag lyckades genomföra på några timmar. Personen jag pratade med om anställning antydde att de skulle fråga om algoritmer och datastrukturer – ämnen som jag inte hunnit bemästra ännu. Som sagt, det var 15 dagar innan intervjun. Jag kan det här! Robert Lafores bok "Data Structures & Algorithms in Java" hjälpte mig. jag gjorde inte Jag hinner inte läsa och förstå allt på två veckor, men jag har ändå lärt mig mycket. Och så kom dagen för intervjun. Jag kom på utsatt tid. Två män hälsade på mig och intervjun började. Att säga att jag var orolig vore en vild underdrift. Min röst darrade. De frågade om allt utom algoritmer och datastrukturer. De frågade om Spring, DI, IoC, Hibernate, hur JVM fungerar, hur sopsamlaren fungerar — jag kunde inte svara på en enda av dessa frågor. Jag svarade bara på frågor om Java Core (samlingar, undantag, OOP, etc.). Medan jag fortfarande var på intervjun visste jag att jag misslyckades, men jag var fortfarande besviken över att inte få någon feedback. Istället identifierade jag luckor i mina kunskaper och började arbeta flitigt för att täppa till dem. Och så kom dagen för intervjun. Jag kom på utsatt tid. Två män hälsade på mig och intervjun började. Att säga att jag var orolig vore en vild underdrift. Min röst darrade. De frågade om allt utom algoritmer och datastrukturer. De frågade om Spring, DI, IoC, Hibernate, hur JVM fungerar, hur sopsamlaren fungerar — jag kunde inte svara på en enda av dessa frågor. Jag svarade bara på frågor om Java Core (samlingar, undantag, OOP, etc.). Medan jag fortfarande var på intervjun visste jag att jag misslyckades, men jag var fortfarande besviken över att inte få någon feedback. Istället identifierade jag luckor i mina kunskaper och började arbeta flitigt för att täppa till dem. Och så kom dagen för intervjun. Jag kom på utsatt tid. Två män hälsade på mig och intervjun började. Att säga att jag var orolig vore en vild underdrift. Min röst darrade. De frågade om allt utom algoritmer och datastrukturer. De frågade om Spring, DI, IoC, Hibernate, hur JVM fungerar, hur sopsamlaren fungerar — jag kunde inte svara på en enda av dessa frågor. Jag svarade bara på frågor om Java Core (samlingar, undantag, OOP, etc.). Medan jag fortfarande var på intervjun visste jag att jag misslyckades, men jag var fortfarande besviken över att inte få någon feedback. Istället identifierade jag luckor i mina kunskaper och började arbeta flitigt för att täppa till dem. Att säga att jag var orolig vore en vild underdrift. Min röst darrade. De frågade om allt utom algoritmer och datastrukturer. De frågade om Spring, DI, IoC, Hibernate, hur JVM fungerar, hur sopsamlaren fungerar — jag kunde inte svara på en enda av dessa frågor. Jag svarade bara på frågor om Java Core (samlingar, undantag, OOP, etc.). Medan jag fortfarande var på intervjun visste jag att jag misslyckades, men jag var fortfarande besviken över att inte få någon feedback. Istället identifierade jag luckor i mina kunskaper och började arbeta flitigt för att täppa till dem. Att säga att jag var orolig vore en vild underdrift. Min röst darrade. De frågade om allt utom algoritmer och datastrukturer. De frågade om Spring, DI, IoC, Hibernate, hur JVM fungerar, hur sopsamlaren fungerar — jag kunde inte svara på en enda av dessa frågor. Jag svarade bara på frågor om Java Core (samlingar, undantag, OOP, etc.). Medan jag fortfarande var på intervjun visste jag att jag misslyckades, men jag var fortfarande besviken över att inte få någon feedback. Istället identifierade jag luckor i mina kunskaper och började arbeta flitigt för att täppa till dem. Jag svarade bara på frågor om Java Core (samlingar, undantag, OOP, etc.). Medan jag fortfarande var på intervjun visste jag att jag misslyckades, men jag var fortfarande besviken över att inte få någon feedback. Istället identifierade jag luckor i mina kunskaper och började arbeta flitigt för att täppa till dem. Jag svarade bara på frågor om Java Core (samlingar, undantag, OOP, etc.). Medan jag fortfarande var på intervjun visste jag att jag misslyckades, men jag var fortfarande besviken över att inte få någon feedback. Istället identifierade jag luckor i mina kunskaper och började arbeta flitigt för att täppa till dem.Jag hittade ett jobb en månad efter min misslyckade intervju. Förresten, jag hittade ledigheten i diskussioner om CodeGym ( CodeGym är den ryskspråkiga versionen av CodeGym — red.anm.). Först var det en Skype-intervju med en rekryterare (den varade i cirka 2 timmar). De frågade om Java Core, sophämtning (nu visste jag hur det fungerar), databaser och datastrukturer. Intervjuaren bad mig dela min skärm och skriva en miniräknare. Jag grät nästan av glädje, eftersom jag hade skrivit en miniräknare bara en vecka innan. Säker på mig själv började jag med uppgiften. Men vare sig det var på grund av min upphetsning eller av någon annan anledning glömde jag en del av algoritmen. Min skärm delades. Jag var rädd för att konsultera Google. Som tur var hade jag min mobiltelefon vilket räddade min rumpa. Dagen efter kallade de till en personlig intervju och ett par dagar senare fick jag ett erbjudande. Det var inte en officiell position. Min roll var en lärling till en enskild firma. Vi skrev en tjänst för evenemangsplanering, försäljning av biljetter etc. Jag minns min första arbetsdag. Min chef tog 15 minuter på sig att förklara vad som behövde göras. "Är allt klart?" han frågade. "Hmm, inte riktigt. Kan du gå igenom det en gång till?" frågade jag med stor oro. Chefen förklarade allt igen. "Det är klart nu?" "Ja, nu är det." Jag förstod faktiskt INGENTING. Men jag var rädd för att be om en annan förklaring. Jag tror att alla anställda kan förstå det. Uppgiften kokade ner till portering från Thymeleaf till AngularJS. Lyckligtvis hittade jag en bit färdig kod och använde den som ett exempel på vad jag skulle göra. Jag förstod inte hur det fungerade, men jag avslutade uppgiften. Jag tilldelades därefter uppgifter direkt relaterade till backend. Först efter en praktisk erfarenhet av Spring började jag förstå vad jag läste i "Vår för proffs". Jag arbetade där i 8 månader och flyttade sedan till en annan stad, där jag snabbt hittade ett officiellt jobb, jobbade i 2 år och ändrade min titel från "junior" till "mid-level" längs vägen. Sedan stod jag inför det faktum att mitt jobb hade blivit rutin och gav mig inte en droppe nöje. Så jag tog en paus. För att stoppa mina fingrar från att förtvina under min paus bestämde jag mig för att försöka mig på ett annat område: spelutveckling. Mer specifikt, mobilspelsutveckling, plocka upp Android, eftersom jag redan kunde Java. Och det är vad jag ska prata om i detalj nu. Först efter en praktisk erfarenhet av Spring började jag förstå vad jag läste i "Vår för proffs". Jag arbetade där i 8 månader och flyttade sedan till en annan stad, där jag snabbt hittade ett officiellt jobb, jobbade i 2 år och ändrade min titel från "junior" till "mid-level" längs vägen. Sedan stod jag inför det faktum att mitt jobb hade blivit rutin och gav mig inte en droppe nöje. Så jag tog en paus. För att stoppa mina fingrar från att förtvina under min paus bestämde jag mig för att försöka mig på ett annat område: spelutveckling. Mer specifikt, mobilspelsutveckling, plocka upp Android, eftersom jag redan kunde Java. Och det är vad jag ska prata om i detalj nu. Först efter en praktisk erfarenhet av Spring började jag förstå vad jag läste i "Vår för proffs". Jag arbetade där i 8 månader och flyttade sedan till en annan stad, där jag snabbt hittade ett officiellt jobb, jobbade i 2 år och ändrade min titel från "junior" till "mid-level" längs vägen. Sedan stod jag inför det faktum att mitt jobb hade blivit rutin och gav mig inte en droppe nöje. Så jag tog en paus. För att stoppa mina fingrar från att förtvina under min paus bestämde jag mig för att försöka mig på ett annat område: spelutveckling. Mer specifikt, mobilspelsutveckling, plocka upp Android, eftersom jag redan kunde Java. Och det är vad jag ska prata om i detalj nu. där jag snabbt hittade ett officiellt jobb, jobbade i 2 år och ändrade min titel från "junior" till "mid-level" längs vägen. Sedan stod jag inför det faktum att mitt jobb hade blivit rutin och gav mig inte en droppe nöje. Så jag tog en paus. För att stoppa mina fingrar från att förtvina under min paus bestämde jag mig för att försöka mig på ett annat område: spelutveckling. Mer specifikt, mobilspelsutveckling, plocka upp Android, eftersom jag redan kunde Java. Och det är vad jag ska prata om i detalj nu. där jag snabbt hittade ett officiellt jobb, jobbade i 2 år och ändrade min titel från "junior" till "mid-level" längs vägen. Sedan stod jag inför det faktum att mitt jobb hade blivit rutin och gav mig inte en droppe nöje. Så jag tog en paus. För att stoppa mina fingrar från att förtvina under min paus bestämde jag mig för att försöka mig på ett annat område: spelutveckling. Mer specifikt, mobilspelsutveckling, plocka upp Android, eftersom jag redan kunde Java. Och det är vad jag ska prata om i detalj nu. Jag bestämde mig för att försöka mig på ett annat område: spelutveckling. Mer specifikt, mobilspelsutveckling, plocka upp Android, eftersom jag redan kunde Java. Och det är vad jag ska prata om i detalj nu. Jag bestämde mig för att försöka mig på ett annat område: spelutveckling. Mer specifikt, mobilspelsutveckling, plocka upp Android, eftersom jag redan kunde Java. Och det är vad jag ska prata om i detalj nu.Mitt lag. I korthet hade jag satt ihop ett litet team på 4 personer (inklusive mig): 2 utvecklare, 1 speldesigner och 1 ljudtekniker. Eftersom ingen i teamet hade någon erfarenhet av spelutveckling, och eftersom min semester var begränsad, bestämde vi oss för att genomföra ett enkelt projekt som vi definitivt skulle kunna slutföra. Och så gjorde vi! Till en början var deadline den 15 november, men som bekant är det bara fel att avsluta ett projekt enligt tidtabell. Så vi avslutade det två veckor för sent. Vår teknikstack bestod av Java 8 och libGDX.

Utveckling

Utvecklingen började den 17 oktober. Totalt tillbringade vi 45 dagar under vilka:
  1. Vi lärde oss hur man använder libGDX.
  2. Vi skrev kod.
  3. Vi skapade grafik.
  4. Vi skapade musik.
Alla som har sett spelet kan fråga sig: "Varför tog det så lång tid? Spelet är så enkelt." Ja, det är sant, och för att vara exakt tog utvecklingsdelen (att skriva koden) ungefär en och en halv vecka. Resten av tiden var uppdelad mellan:
  1. Bemästra hur man använder spelmotorn.
  2. Rita och rita om konstverk.
  3. Att skriva musik.
  4. Söker efter ljud på https://freesound.org .
  5. Läser massor av artiklar om hur man marknadsför spel.
Vi hade också stunder av "stopptid" av olika anledningar: någon hade en tenta, någon annan gjorde ett sminktest etc. Vi kan säkert tillskriva stilleståndet en och en halv vecka eller mer. En del tid ägnades också åt "debatter": nya idéer om vad man skulle lägga till i spelet dök upp nästan dagligen, så vi diskuterade: "det där är överflödigt", "det passar inte" etc. Vi kastade ut många idéer, till exempel lägga till löpande kackerlackor som kunde krossas för att få extra poäng: enligt mig var en av de svåraste sakerna att i förväg bestämma vad som skulle vara i spelet och att hålla sig till planen utan att försöka lägga till "bara en till " funktion. Det var så dessa 45 dagar ackumulerades. En prototyp av spelet var klar efter en och en halv vecka. Under den här perioden hade vi verkligen ingen grafik, I början var det ... - 2Spelet är väldigt enkelt i teknisk mening. Vi behövde inte ens använda box2d (en fysikmotor). Vi kan hantera kollisioner och beräkna hypotenusan på egen hand. De mest intressanta punkterna jag kommer att lyfta fram är:
  1. Till en början genererades alla spelelement slumpmässigt. Med andra ord, vi satte leverantörer (av svarta hål, sax, ninjastjärnor, blyertspenna, hjärtan) i en array, fick en slumpmässig leverantör, fick ett element med slumpmässiga koordinater. Det blev ganska snabbt klart att det här tillvägagångssättet var "verkligen inte riktigt bra". Vänner som deltog i tester berättade samma sak för oss och rekommenderade användning av mallar. För de som är inblandade i spelutveckling är detta förmodligen en självklar lösning. Men eftersom vi var nykomlingar på området var det väldigt praktiska råd för oss.

    Så vi skapade flera mallar: en dal av sax; blyertspennor — det är ganska coolt att samla dem supersnabbt (whoosh, whoosh, whoosh med fingret); och en mall till som jag inte vet vad jag ska kalla — jag ska bara berätta vad vi kallade klassen i vår kod: StraightForwardPattern.

    I början var det ... - 3

    Dessa mallar förbättrade det, men det blev för förutsägbart på något sätt. Det var därför vi lade till en till: en slumpmässig mall. Med andra ord har vi nu några "statiska" mallar och en slumpmässig (infoga "perfekt balanserad" meme här).

  2. Här är huvudproblemet vi stötte på. LibGDX anropar render-metoden (float delta) i en oändlig loop. Det är här alla element ritas. Pennlinjen ritas enligt följande: vi får fingerkoordinater och ritar textur där. Så om vi flyttade fingret över skärmen väldigt snabbt, skulle linjen ha "luckor" på grund av millisekunderna mellan anrop till render(delta)-metoden.

    Lösningen var ganska enkel: vi kommer ihåg de sista koordinaterna där texturen är ritad, får nästa koordinater, och om avståndet mellan dem är mer än X och fingret inte har släppts, fyller vi luckan. Först trodde vi att det här alternativet kanske inte skulle fungera - linjerna skulle vara kantiga. Men våra farhågor var ogrundade, allt fungerade precis som det skulle.

Om spelet

Spelet gör inte anspråk på att vara unikt, men det är ganska bra och kan dra in användare. Du styr en penna, bokstavligen ritar på papper och undviker hinder – sax, ninjastjärnor och svarta hål. Under tiden börjar din blyertspenna ta slut och du måste plocka upp små pennor. Om din penna håller på att ta slut innan du samlar en liten penna, kan du plocka upp en bit av en spegel. I några sekunder, istället för att förbruka blyertspennan, kommer den att återställas, men samtidigt speglas kontrollerna - om ditt finger rör sig till vänster, drar pennan åt höger. Du kan också plocka upp ett hjärta som låter dig träffa ett hinder en gång och hålla dig vid liv. Ju längre du flyttar pennan utan att lyfta fingret, desto högre blir din kombination, vilket betyder att du kommer att samla poäng snabbare. I början var det ... - 4Hastigheten i spelet ökar också gradvis. Det enda som saknas är arga fåglar. Från början planerade vi att döpa spelet till Karan Dash (translitterationen av det ryska ordet för penna är karandash — ha! förstår det?), men senare ändrade vi oss och bestämde oss för Pencil Dash. Vi gjorde detta för att denna graciösa ordlek endast skulle förstås av en rysktalande publik. Vi släppte spelet för ett par dagar sedan och marknadsför det nu. Inte heller här har någon i laget någon erfarenhet. Vi fick all vår kunskap om spelmarknadsföring från olika artiklar. Vi publicerade information om spelet på olika webbplatser/forum gratis. Våra betalkanaler inkluderade annonsering på 4pd, annonsering med en bloggare, flera inlägg i offentliga grupper på VKontakte och AdMob-annonsering. Detta inlägg är förresten också en del av vår kampanj, så med tillstånd från webbplatsens administration lägger jag in en länk till spelet här. Du hittar spelet på Google Play här . Jag skulle vara tacksam om du ville installera den (kanske du kommer att gilla den!), och om du lämnar ett betyg så lovar jag att döpa ett barn efter dig! :) I början var det ... - 6