CodeGym/Blog Java/Aleatoriu/La început, a existat...
John Squirrels
Nivel
San Francisco

La început, a existat...

Publicat în grup
La început, a fost ... - 1 Perioada de probă a primului meu loc de muncă s-a încheiat acum 3 ani, dar abia acum am găsit timp să scriu un articol. Am petrecut un an în diferite departamente din universitatea mea: în primul semestru, am studiat managementul, iar în al doilea semestru, am trecut la ingineria software. Am sperat că mă vor învăța cum să programez, dar m-am înșelat. Așa că, am adunat materiale și am decis să învăț totul pe cont propriu. Singurul motiv pentru care sunt recunoscător profesorului meu este că mi-a recomandat să încep cu cartea electronică a lui Stephen Pratt „Limbajul de programare C”. Este cu adevărat o carte bună, cu o mulțime de exerciții practice. Am petrecut aproximativ 2 luni pe carte, după care am dat peste acest curs Java online în grupurile unui prieten și așa a început. La început, am plănuit să devin un dezvoltator Android, dar backend-ul mi s-a părut mai interesant pe măsură ce progresam în învățare. Apropo, mi-au luat 3 luni de studii pentru a ajunge la Nivelul 20, după care am decis să încerc să-mi găsesc un loc de muncă. Prima ordine de lucru a fost să se mute în alt orașdin moment ce al meu nu avea locuri de muncă pentru un dezvoltator Java junior. Am găsit o companie, am aplicat și am primit o sarcină de testare, pe care mi s-a dat o săptămână să o duc la bun sfârșit. A trebuit să scriu o aplicație web simplă folosind Hibernate, Servlet/JSP și MySQL. Văzând toți acești termeni, am știut doar că MySQL este o bază de date. La început, am fost foarte dezamăgit. Am decis chiar să caut locuri de muncă la unele KFC, dar apoi m-am hotărât să fac o problemă la sarcina de testare. La urma urmei, aș putea oricând să obțin un loc de muncă la KFC. Am lucrat non-stop toată săptămâna și am reușit să termin testul. Mi-am trimis soluția, dar „nu a fost drăguță”, așa că am mai revizuit-o de 4 ori. Ultima mea soluție s-a dovedit a fi corectă, dar posturile fuseseră deja ocupate și cererile suplimentare nu vor fi acceptate timp de 3 luni. Ce ai de gând să faci, nu? Pentru următoarele 3 luni, Am învățat HTML, CSS, JS, SQL și PHP. De ce PHP? Aveam nevoie de un limbaj de server care să răspundă la solicitări și altele. La acea vreme, servlet-urile și jsp păreau prea complicate. În cele din urmă, am produs o aplicație web cu drepturi depline, cu o interfață groaznică. Am publicat codul pe GitHub pentru portofoliul meu. Până atunci, au trecut 3 luni și aceeași companie m-a contactat din nou și m-a invitat la un interviu, oferindu-mi o altă sarcină simplă pentru a-mi testa cunoștințele de SQL, pe care am reușit să o duc la bun sfârșit în câteva ore. Persoana cu care vorbeam despre angajare a sugerat că va întreba despre algoritmi și structuri de date - subiecte pe care nu am avut timp să le stăpânesc încă. Acestea fiind spuse, au fost 15 zile înainte de interviu. Ma descurc! M-a ajutat cartea lui Robert Lafore „Data Structures & Algorithms in Java”. Nu am' Nu am timp să citesc și să înțeleg totul în două săptămâni, dar încă am învățat multe. Și apoi a venit ziua interviului. Am ajuns la ora stabilită. Doi bărbați m-au salutat și a început interviul. A spune că sunt îngrijorat ar fi un eufemism. Glasul mi-a tremurat. Au întrebat despre orice, cu excepția algoritmilor și a structurilor de date. Au întrebat despre Spring, DI, IoC, Hibernate, cum funcționează JVM-ul, cum funcționează colectorul de gunoi - nu am putut să răspund la nici una dintre aceste întrebări. Am răspuns cu succes doar la întrebări despre Java Core (colecții, excepții, OOP etc.). Pe când eram încă la interviu, știam că nu am reușit, dar am fost totuși dezamăgit să nu primesc niciun feedback. În schimb, am identificat lacune în cunoștințele mele și am început să lucrez cu sârguință pentru a le închide. Și apoi a venit ziua interviului. Am ajuns la ora stabilită. Doi bărbați m-au salutat și a început interviul. A spune că sunt îngrijorat ar fi un eufemism. Glasul mi-a tremurat. Au întrebat despre orice, cu excepția algoritmilor și a structurilor de date. Au întrebat despre Spring, DI, IoC, Hibernate, cum funcționează JVM-ul, cum funcționează colectorul de gunoi - nu am putut să răspund la nici una dintre aceste întrebări. Am răspuns cu succes doar la întrebări despre Java Core (colecții, excepții, OOP etc.). Pe când eram încă la interviu, știam că nu am reușit, dar am fost totuși dezamăgit să nu primesc niciun feedback. În schimb, am identificat lacune în cunoștințele mele și am început să lucrez cu sârguință pentru a le închide. Și apoi a venit ziua interviului. Am ajuns la ora stabilită. Doi bărbați m-au salutat și a început interviul. A spune că sunt îngrijorat ar fi un eufemism. Glasul mi-a tremurat. Au întrebat despre orice, cu excepția algoritmilor și a structurilor de date. Au întrebat despre Spring, DI, IoC, Hibernate, cum funcționează JVM-ul, cum funcționează colectorul de gunoi - nu am putut să răspund la nici una dintre aceste întrebări. Am răspuns cu succes doar la întrebări despre Java Core (colecții, excepții, OOP etc.). Pe când eram încă la interviu, știam că nu am reușit, dar am fost totuși dezamăgit să nu primesc niciun feedback. În schimb, am identificat lacune în cunoștințele mele și am început să lucrez cu sârguință pentru a le închide. A spune că sunt îngrijorat ar fi un eufemism. Glasul mi-a tremurat. Au întrebat despre orice, cu excepția algoritmilor și a structurilor de date. Au întrebat despre Spring, DI, IoC, Hibernate, cum funcționează JVM-ul, cum funcționează colectorul de gunoi - nu am putut să răspund la nici una dintre aceste întrebări. Am răspuns cu succes doar la întrebări despre Java Core (colecții, excepții, OOP etc.). Pe când eram încă la interviu, știam că nu am reușit, dar am fost totuși dezamăgit să nu primesc niciun feedback. În schimb, am identificat lacune în cunoștințele mele și am început să lucrez cu sârguință pentru a le închide. A spune că sunt îngrijorat ar fi un eufemism. Glasul mi-a tremurat. Au întrebat despre orice, cu excepția algoritmilor și a structurilor de date. Au întrebat despre Spring, DI, IoC, Hibernate, cum funcționează JVM-ul, cum funcționează colectorul de gunoi - nu am putut să răspund la nici una dintre aceste întrebări. Am răspuns cu succes doar la întrebări despre Java Core (colecții, excepții, OOP etc.). Pe când eram încă la interviu, știam că nu am reușit, dar am fost totuși dezamăgit să nu primesc niciun feedback. În schimb, am identificat lacune în cunoștințele mele și am început să lucrez cu sârguință pentru a le închide. Am răspuns cu succes doar la întrebări despre Java Core (colecții, excepții, OOP etc.). Pe când eram încă la interviu, știam că nu am reușit, dar am fost totuși dezamăgit să nu primesc niciun feedback. În schimb, am identificat lacune în cunoștințele mele și am început să lucrez cu sârguință pentru a le închide. Am răspuns cu succes doar la întrebări despre Java Core (colecții, excepții, OOP etc.). Pe când eram încă la interviu, știam că nu am reușit, dar am fost totuși dezamăgit să nu primesc niciun feedback. În schimb, am identificat lacune în cunoștințele mele și am început să lucrez cu sârguință pentru a le închide.Mi-am găsit un loc de muncă la o lună după interviul meu eșuat. Apropo, am găsit locul de muncă deschis în discuțiile pe CodeGym ( CodeGym este versiunea în limba rusă a CodeGym - nota editorului). Mai întâi, a fost un interviu pe Skype cu un recrutor (a durat aproximativ 2 ore). Au întrebat despre Java Core, colectarea gunoiului (acum știam cum funcționează), baze de date și structuri de date. Intervievatorul mi-a cerut să-mi partajez ecranul și să scriu un calculator. Aproape că am plâns de bucurie, deoarece scrisesem un calculator cu doar o săptămână înainte. Încrezător în mine, am început sarcina. Dar fie din cauza entuziasmului meu, fie dintr-un alt motiv, am uitat o parte din algoritm. Ecranul meu a fost partajat. Mi-a fost frică să consult Google. Din fericire, aveam telefonul mobil, care mi-a salvat fundul. A doua zi, au sunat pentru un interviu personal și câteva zile mai târziu am primit o ofertă. Nu a fost o poziție oficială. Rolul meu a fost ucenic la un proprietar unic. Am scris un serviciu pentru planificarea evenimentelor, vânzarea biletelor etc. Îmi amintesc prima mea zi de muncă. Șeful meu i-a luat 15 minute pentru a explica ce trebuie făcut. — E totul clar? el a intrebat. "Hmm, nu chiar. Poți să mai treci peste asta o dată?" am întrebat cu mare îngrijorare. Șeful a explicat totul din nou. — E clar acum? — Da, acum este. De fapt, nu am înțeles NIMIC. Dar mi-a fost frică să cer o altă explicație. Cred că oricine angajat poate înțelege asta. Sarcina s-a rezumat la portarea de la Thymeleaf la AngularJS. Din fericire, am găsit o bucată de cod terminat și l-am folosit ca exemplu de ce trebuie făcut. Nu am înțeles cum funcționează, dar am terminat sarcina. Ulterior, mi s-au atribuit sarcini direct legate de backend. Abia după o experiență practică cu Spring am început să înțeleg ce am citit în „Primăvara pentru profesioniști”. Am lucrat acolo 8 luni și apoi m-am mutat în alt oraș, unde mi-am găsit rapid un loc de muncă oficial, am lucrat 2 ani și mi-am schimbat pe parcurs titlul din „junior” în „mid-level”. Apoi m-am confruntat cu faptul că meseria mea devenise rutină și nu-mi dădea nici un strop de plăcere. Așa că am luat o pauză. Pentru a nu-mi atrofia degetele în timpul pauzei, am decis să-mi încerc mâna într-un alt domeniu: dezvoltarea jocului. Mai precis, dezvoltarea jocurilor mobile, preluarea Android, deoarece știam deja Java. Și despre asta voi vorbi acum în detaliu. Abia după o experiență practică cu Spring am început să înțeleg ce am citit în „Primăvara pentru profesioniști”. Am lucrat acolo 8 luni și apoi m-am mutat în alt oraș, unde mi-am găsit rapid un loc de muncă oficial, am lucrat 2 ani și mi-am schimbat pe parcurs titlul din „junior” în „mid-level”. Apoi m-am confruntat cu faptul că meseria mea devenise rutină și nu-mi dădea nici un strop de plăcere. Așa că am luat o pauză. Pentru a nu-mi atrofia degetele în timpul pauzei, am decis să-mi încerc mâna într-un alt domeniu: dezvoltarea jocului. Mai precis, dezvoltarea jocurilor mobile, preluarea Android, deoarece știam deja Java. Și despre asta voi vorbi acum în detaliu. Abia după o experiență practică cu Spring am început să înțeleg ce am citit în „Primăvara pentru profesioniști”. Am lucrat acolo 8 luni și apoi m-am mutat în alt oraș, unde mi-am găsit rapid un loc de muncă oficial, am lucrat 2 ani și mi-am schimbat pe parcurs titlul din „junior” în „mid-level”. Apoi m-am confruntat cu faptul că meseria mea devenise rutină și nu-mi dădea nici un strop de plăcere. Așa că am luat o pauză. Pentru a nu-mi atrofia degetele în timpul pauzei, am decis să-mi încerc mâna într-un alt domeniu: dezvoltarea jocului. Mai precis, dezvoltarea jocurilor mobile, preluarea Android, deoarece știam deja Java. Și despre asta voi vorbi acum în detaliu. unde mi-am găsit rapid un loc de muncă oficial, am lucrat 2 ani și mi-am schimbat pe parcurs titlul din „junior” în „mid-level”. Apoi m-am confruntat cu faptul că meseria mea devenise rutină și nu-mi dădea nici un strop de plăcere. Așa că am luat o pauză. Pentru a nu-mi atrofia degetele în timpul pauzei, am decis să-mi încerc mâna într-un alt domeniu: dezvoltarea jocului. Mai precis, dezvoltarea jocurilor mobile, preluarea Android, deoarece știam deja Java. Și despre asta voi vorbi acum în detaliu. unde mi-am găsit rapid un loc de muncă oficial, am lucrat 2 ani și mi-am schimbat pe parcurs titlul din „junior” în „mid-level”. Apoi m-am confruntat cu faptul că meseria mea devenise rutină și nu-mi dădea nici un strop de plăcere. Așa că am luat o pauză. Pentru a nu-mi atrofia degetele în timpul pauzei, am decis să-mi încerc mâna într-un alt domeniu: dezvoltarea jocului. Mai precis, dezvoltarea jocurilor mobile, preluarea Android, deoarece știam deja Java. Și despre asta voi vorbi acum în detaliu. Am decis să-mi încerc mâna într-un alt domeniu: dezvoltarea jocurilor. Mai precis, dezvoltarea jocurilor mobile, preluarea Android, deoarece știam deja Java. Și despre asta voi vorbi acum în detaliu. Am decis să-mi încerc mâna într-un alt domeniu: dezvoltarea jocurilor. Mai precis, dezvoltarea jocurilor mobile, preluarea Android, deoarece știam deja Java. Și despre asta voi vorbi acum în detaliu.Echipa mea. În scurt timp, am adunat o echipă mică de 4 persoane (inclusiv eu): 2 dezvoltatori, 1 designer de jocuri și 1 inginer de sunet. Pentru că nimeni din echipă nu avea experiență în dezvoltarea jocurilor și pentru că timpul meu de vacanță era limitat, am decis să implementăm un proiect simplu pe care cu siguranță îl vom putea finaliza. Și așa am făcut! Inițial, termenul limită era 15 noiembrie, dar după cum știți, finalizarea unui proiect în termen este pur și simplu greșită. Deci, l-am terminat cu două săptămâni întârziere. Stiva noastră de tehnologie a constat din Java 8 și libGDX.

Dezvoltare

Dezvoltarea a început pe 17 octombrie. În total, am petrecut 45 de zile în care:
  1. Am învățat cum să folosim libGDX.
  2. Am scris cod.
  3. Am creat grafica.
  4. Noi am creat muzica.
Oricine a văzut jocul ar putea întreba: „De ce a durat atât de mult? Jocul este atât de simplu”. Da, este adevărat și, pentru a fi precis, partea de dezvoltare (scrierea codului) a durat aproximativ o săptămână și jumătate. Restul timpului a fost împărțit între:
  1. Stăpânirea modului de utilizare a motorului de joc.
  2. Desenarea și redesenarea lucrărilor de artă.
  3. Scrierea muzicii.
  4. Căutând sunete pe https://freesound.org .
  5. Citind o mulțime de articole despre cum să promovezi jocurile.
Am avut și momente de „downtime” din diverse motive: cineva a avut un examen, altcineva a avut un test de machiaj etc. Putem atribui cu siguranță o săptămână și jumătate sau mai mult timpului de nefuncționare. S-a petrecut ceva timp și pe „dezbateri”: idei noi despre ce să adăugați în joc apăreau aproape zilnic, așa că am dezbătut: „asta e de prisos”, „asta nu se potrivește” etc. Am aruncat o mulțime de idei, de exemplu, adăugarea gândacilor alergători care puteau fi zdrobiți pentru a obține puncte în plus: în opinia mea, unul dintre cele mai dificile lucruri a fost să decizi dinainte ce va fi în joc și să rămâi la plan fără a încerca să adaugi „încă unul. " caracteristică. Așa s-au acumulat aceste 45 de zile. Un prototip al jocului a fost gata după o săptămână și jumătate. În această perioadă, chiar nu am avut nicio grafică, La început, a fost ... - 2Jocul este foarte simplu din punct de vedere tehnic. Nici nu a fost nevoie să folosim box2d (un motor de fizică). Ne putem ocupa de coliziuni și putem calcula singuri ipotenuza. Cele mai interesante puncte pe care le voi evidenția sunt:
  1. Inițial, toate elementele jocului au fost generate aleatoriu. Cu alte cuvinte, am pus furnizori (de găuri negre, foarfece, stele ninja, mine de creion, inimioare) într-o matrice, am primit un furnizor aleator, am primit un element cu coordonate aleatorii. A devenit clar destul de repede că această abordare a fost „chiar nu foarte bună”. Prietenii care au participat la testare ne-au spus același lucru, recomandând folosirea șabloanelor. Pentru cei implicați în dezvoltarea jocului, aceasta este probabil o soluție evidentă. Dar pentru că eram noi veniți în domeniu, a fost un sfat foarte practic pentru noi.

    Așa că am creat mai multe șabloane: o vale de foarfece; mine de creion — este destul de mișto să le strângi foarte repede (whoosh, whoosh, whoosh cu degetul); și încă un șablon pe care nu știu cum să-l numesc — îți voi spune doar cum am numit clasa în codul nostru: StraightForwardPattern.

    La început, a fost... - 3

    Aceste șabloane l-au îmbunătățit, dar a devenit într-un fel prea previzibil. De aceea am adăugat încă unul: un șablon aleatoriu. Cu alte cuvinte, acum avem câteva șabloane „statice” și unul aleatoriu (inserați aici meme „perfect echilibrat”).

  2. Iată principala problemă pe care am întâlnit-o. LibGDX apelează metoda de randare (float delta) într-o buclă infinită. Aici sunt desenate toate elementele. Linia creionului este desenată după cum urmează: obținem coordonatele degetelor și desenăm textura acolo. Deci, dacă ne-am mișca degetul pe ecran foarte repede, atunci linia ar avea „goluri” din cauza milisecundelor dintre apelurile la metoda render(delta).

    Soluția a fost destul de simplă: ne amintim ultimele coordonate în care este desenată textura, obținem următoarele coordonate, iar dacă distanța dintre ele este mai mare de X și degetul nu a fost eliberat, atunci umplem golul. La început, ne-am gândit că această opțiune ar putea să nu funcționeze - liniile ar fi unghiulare. Dar temerile noastre erau nefondate, totul a funcționat așa cum trebuia.

Despre joc

Gameplay-ul nu pretinde a fi unic, dar este destul de bun și poate atrage utilizatorii. Controlați un creion, desenând literalmente pe hârtie și evitând obstacole - foarfece, stele ninja și găuri negre. Între timp, mine de creion se epuizează și trebuie să ridici creioane mici. Dacă creionul tău se apropie de sfârșit înainte de a strânge un mic creion, poți ridica o bucată de oglindă. Pentru câteva secunde, în loc să consumi mine de creion, aceasta va fi restaurată, totuși, în același timp, comenzile sunt oglindite - dacă degetul se mișcă la stânga, atunci creionul trage spre dreapta. De asemenea, puteți ridica o inimă care vă va permite să loviți un obstacol o dată și să rămâneți în viață. Cu cât mișcați mai mult creionul fără să ridicați degetul, cu atât combo-ul este mai mare, ceea ce înseamnă că veți acumula puncte mai repede. La început, a fost... - 4Viteza jocului crește, de asemenea, treptat. Singurul lucru care lipsește sunt păsările furioase. Inițial, am plănuit să denumim jocul Karan Dash (transliterarea cuvântului rusesc pentru creion este karandash — ha! înțelegi?), dar mai târziu ne-am răzgândit și ne-am hotărât pe Pencil Dash. Am făcut asta pentru că acest joc de cuvinte grațios ar fi înțeles doar de un public vorbitor de limbă rusă. Am lansat jocul acum câteva zile și acum îl promovăm. Și aici nimeni din echipă nu are experiență. Am acumulat toate cunoștințele noastre despre promovarea jocurilor din diverse articole. Am publicat gratuit informații despre joc pe diverse site-uri/forumuri. Canalele noastre plătite au inclus publicitate pe 4pd, publicitate cu un blogger, mai multe postări în grupuri publice pe VKontakte și publicitate AdMob. Apropo, această postare face parte și din promoția noastră, așa că, cu permisiunea administrației site-ului, includ aici un link către joc. Puteți găsi jocul pe Google Play aici . V-aș fi recunoscător dacă l-ați instala (poate vă va plăcea!), iar dacă veți lăsa un rating, vă promit că voi numi un copil după tine! :) La început, a fost ... - 6
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu