TSM - Roller Coaster-ul Imagine Cup

Alex Pana - internship student

Imagine Cup este o competiție anuală organizată de Microsoft ce promovează inovația și tehnologiile proprii. Echipe de până la patru studenți, în decursul unui an, acceptă provocarea de a scrie o aplicație care să contribuie la Millenium Development Goals. Anul acesta însă, condiția temei a fost revocată, oferindu-ne libertatea de a construi un joc distractiv, care să nu poarte responsabilitatea rezolvării problemei foametei în țările subdezvoltate. Am amânat participarea la această competiție încă din primul an de facultate. Dar acesta era începutul celui de-al treilea meu an, iar cu doar doi ani rămași până la absolvire, nu mai aveam mulți "anul următor" rămași. Trebuia să fac ceva.

JavaScript

În fiecare an, Microsoft anunță tehnologiile dintre care studenții au de ales și pe care sunt nevoiți să le folosească. Printre cele propuse anul trecut se află HTML5. Poftim? HTML5 nu este tehnologie Microsoft! Și totuși era acolo, pe site-ul oficial. Iar noi puteam folosi JavaScript și WebGL pentru a construi un joc 3D incredibil de portabil. Mi-am petrecut următoarea lună citind articole de Douglas Crockford și John Resig. Am scris o colecție de experimente care nu vor vedea niciodată lumina zilei. Scopul meu era să construiesc un engine întreg în JavaScript de la zero. Sistemul de input, grafică, audio, totul. Urma să folosim acest engine pentru a construi jocul nostru extraordinar. Aveam un sistem de input funcțional și un schelet pentru sistemul grafic. Scrisesem de asemenea un plugin pentru Blender care exporta modelele 3D si shader-ele în format JSON. Engine-ul putea încărca modelele si le putea desena folosind shadere. Funcționa și era superb. Asta până când au apărut regulile pentru Microsoft Imagine Cup 2013, iar HTML5 dispăruse de pe lista de tehnologii disponibile.

În momentul acela invitasem deja doi colegi de facultate și buni prieteni: Timotei Dolean și Adrian Soucup, împreună cu un vechi prieten din liceu: Andrei Grigoriu pentru a forma echipa VertexArmy. Aveam încredere în abilitățile si pasiunea lor, iar împreună simțeam că putem face acest lucru posibil. Nu voiam să facem greșeli stupide, așa că ne-am decis să nu scriem nicio linie de cod până nu punem la punct toate aspectele jocului. Pentru început, trebuia să alegem între o grafică 3D sau una 2D. Grafica 2D este mult mai greu de desenat, iar grafica 3D introduce o nouă dimensiune în logica jocului. De asemenea, simțeam că pentru a face un joc distractiv aveam nevoie de un simulator de fizică. Am început să ne întâlnim în weekend-uri, să discutăm idei de joc și să urmărim alte jocuri asemănătoare. Ne doream un joc care să fie simplu (spre deosebire de complex), cu o mecanică ușor de înțeles, și care să conțină puzzle-uri creative construite pe baza mecanicilor. Oricare ar fi ideea finală, aceasta trebuia să fie distractivă, ușor de înțeles, iar puzzle-urile trebuiau să fie rezolvate folosind creativitate și inteligență. În decursul câtorva săptămâni am început sa punem totul cap la cap. Jocul nostru urma să aibă grafică 3D într-o lume 2D. Simulatorul de fizică va funcționa de asemenea în doar două dimensiuni. Lumea jocului va fi plină de tehnologie extraterestră. Puzzle-urile vor necesita folosirea unor abilități și tehnologii pentru a muta lucruri și a repara interiorul unei nave distruse. Urma să avem cuburi pe care jucătorul să le poată muta și folosi pentru a construi aparate cu abilități și scopuri neobișnuite. Spre exemplu, cu rețeta potrivită, zece cuburi ar putea fi folosite pentru a construi un dispozitiv ce inversează gravitația. Un singur cub ar putea fi folosit pentru a construi o rampă scurtă peste o groapă, iar un altul se va putea transforma într-o sursă de energie pentru un dispozitiv deja existent. Cuburile urmau să fie complet identice. Ne simțeam încrezători și ne plăcea direcția în care mergea proiectul.

Unity

Odată ce am găsit ideea generală, a trebuit să alegem tehnologia în care o vom implementa. Platformele XBOX și mobile au ieșit din ecuație deoarece nu aveam tehnologia necesară. Așa că am rămas cu PC-ul. Citind un topic interesant pe forumurile Imagine Cup, am descoperit că aveam voie să folosim engine-uri de jocuri ca Unity, sau chiar Unreal, atât timp cât foloseam produse Microsoft în procesul de dezvoltare (e.g.: scripturi C# în Unity). Ne-am gândit: "Asta e super!". Nefiind nevoie să ne creăm propriul engine grafic puteam să ne concentrăm pe jocul propriu-zis. Așa că fiecare dintre noi ne-am instalat Unity și am început să facem tutoriale. Am creat un demo în care o armată de cuburi urmărea cursorul iar cuburile se spărgeau dacă erau lovite tare de perete. Unity avea tot ce ne era necesar, inclusiv un editor foarte bun pe care îl puteam folosi să tragem din meniul de unelte diferite obiecte pentru a crea jocul. De fapt, era prea mult de tras și prea puțin de scris script-uri. Nu că scripturile nu ar fi fost folositoare sau destul de puternice, ci faptul că erau doar pe locul doi ca importanță în Unity. Totodată, engine-ul era atât de complex încât gândul la cât trebuie să învățăm pentru a-l putea folosi eficient, ne dădea fiori. Am realizat curând că versiunea gratuită de la Unity nu avea facilitatea de "render targets". Acest lucru însemna că nu puteam face niciun efect special, nici măcar un efect simplu de conturare pentru a marca cuburile selectate. Acest lucru a fost dezamăgitor deoarece aveam cunoștințele necesare pentru a implementa efecte, dar engine-ul pur și simplu nu ne lăsa. Iar noi sub nicio formă nu puteam plăti 1500$ pentru asta. Așa că, pentru a doua oară am aruncat totul și am început de la zero...

XNA

Ultima noastră alegere a fost XNA ("XNA"s Not an Acronym"). Acesta este un framework simplu peste DirectX și ne-a oferit tot ceea ce aveam nevoie: un nivel de abstractizare complet, cu unelte și librării matematice. În sfârșit eram gata să începem dezvoltarea jocului nostru. Găsisem ideea de bază și alesesem tehnologia adecvată. Păcat că ne-a luat cinci luni să ajungem aici... Ne-am configurat un repository de Git (împreună cu un front-end numit "Gitlab") pe serverul nostru, ne-am pregătit mediul de lucru (XNA nu merge în mod implicit cu Visual Studio 2012) și ne-am împărțit sarcinile între noi. Aveam nevoie de un artist iar eu eram cel mai potrivit; Andrei urma să se ocupe de integrarea sistemului de fizică și implementarea logicii jocului, Adrian urma să creeze sistemul grafic și shader-ele iar Timotei urma să lucreze pe partea de interfață utilizator și sistemul de intrare (tastatură, mouse, Kinect, etc). Am început să dezvoltăm, încetul cu încetul, folosind Skype pentru a comunica zilnic. Ideea jocului s-a schimbat de-a lungul proiectului. Am adăugat un caracter principal în poveste: un robot în formă triunghiulară care umblă cu ajutorul unor șenile și are niște abilități interesante. Am încercat câteva stiluri grafice, dar nu am fost mulțumiți de rezultate. Unele probleme au fost din cauza modului în care era unghiul camerei sau felul în care texturile erau filtrate, dar majoritatea au fost din cauza lipsei mele de experiență. Până la urmă, simulatorul de fizică s-a integrat superb cu jocul. Andrei a avut ideea de a simula șenilele prin fizică, așa că am exportat fiecare piesă separat (o roată, o șenilă și un corp) iar el le-a folosit pentru a construi robotul ca un sistem de componente simulate fizic. Asta înseamnă că atunci când robotul se deplasează, se rotesc de fapt cele trei roți. Sistemul de fizică folosește forța de frecare dintre roți și șenile pentru a face robotul să se miște. Aceasta s-a dovedit a fi cea mai importantă decizie pe care am luat-o în legătură cu design-ul jocului.

În aprilie a trebuit să trimitem jocul pentru runda de calificare în ciuda faptului că nu era nici pe aproape gata. Echipa a lucrat toată noaptea dinaintea rundei pentru a crea un demo jucabil, programând non-stop. Am adăugat funcționalități și am fixat bug-uri fără să clipim. Dimineața devreme am asamblat împreună câteva înregistrări din joc într-un trailer epic, ce înfățișa un robot curajos luptând împotriva unui univers nemilos. Da, da, știm, nu avea nicio legătură cu jocul nostru, iar judecând după grafică... era un dezastru. Majoritatea texturilor au fost luate rapid de pe Google, iar indicațiile din joc erau afișate cu un font roșu groaznic și aproape imposibil de citit. Cel mai probabil simulatorul de fizică împreună cu grafica 3D au fost piesele de rezistență care ne-a trimis în finală.

Am primit vestea calificarii noastre cu mai puțin de-o săptămână înainte de finala națională. Aceasta însemna că mai aveam cinci zile să facem jocul prezentabil. Am umplut lista de TODO-uri cu o mulțime de funcționalități noi: un nivel secundar, grafică mai bună cu texturi noi, "depth of field", o rescriere a interfeței utilizator și multe altele. Cu o zi înainte de finală aveam încă lucruri neterminate: "depth of field"-ul trebuia îmbunătățit, indicațiile din joc trebuiau și ele îmbunătățite, meniul nu era finalizat și încă ne lipseau texturi. Ne rămăseseră 24 de ore pană la prezentare, iar daca experiența ne-a invațat ceva, este că suntem foarte productivi pe ultima sută de metri.