Deci, în postarea precedentă eu am promis că voi posta codul sursă la jocul prototip. Vreau din start să vă avertizez, prototipul este plin de bug-uri și leak-uri de memorie, nu anume memorie heap, acolo totul e normal, leak-ul merge la nivel de memoria video, care se află în GPU. Build-ul la care lucrez acum am eliminat leak-urile legate de video memorie și multe bug-uri vizuale care se întâlneau rar în prototip, însă când apăreau ele distrugeau toată experiența jocului. În arhivă am inclus doar fișierele cu codul sursă, librăriile dependente și proiectul va trebui singuri să configurați. Am făcut în așa mod, din cauză că eu nu știu dacă voi vă folosiți de același IDE ca și mine, sau pur și simplu scrieți prin editor de cod și compilați direct prin compilator. Fișierele de sunet eu la fel am exclus, din cauză că acestea ocupă mult loc, însă programul nu va rula, dacă nu aveți inclus sunetele celea. Desigur puteți exclude codul legat de sunete, eu când am scris prototipul m-am străduit ca totul să fie OOP, pentru ca să fie mai ușor de modificat codul și de exclus componentele inutile.
Librăriile de care depinde jocul sunt următoarele:
Acestea sunt librăriile de care jocul prototip depinde. La fiecare text este atașat un link, așa că puteți să faceți click pe dânsele și să le scoateți. Ok, acum structura codului și cum acesta este amenajat. Să începem cu cel mai principalul, fără de care nimic nu ar fi posibil.
Clasa OpenGLBase.h conține datele principale pentru ca desenatul imaginii pe ecran să fie posibil. Această clasă se mai folosește de alte clase care răspund de anumite chestii legate de transmiterea datelor în buffer. Acestea sunt Program.h și Shader.h. Program.h este clasa care din 2 sau mai multe shader-e crează un program care este interpretat de GPU. Ce asta înseamnă, pentru a desena anumite chestii la ecran, este nevoie de un program dedicat anume desenatului la ecran. Shader.h este codul sursă dedicat pentru GPU care este deodată compilat ca să fie mai târziu atașat împreună cu alte shader-e într-un program întreg.
FaceMesh.h și Player.h sunt acelea care moștenesc clasa OpenGLBase.h și în acelea se scriu datele pentru desenare pe ecran.
FaceColon.h este o clasă care generează o coloană de obiecte de tipul FaceMesh.h. La fel în FaceColon.h se controlează când trebuie să fie animate obiectele FaceMesh. Pentru ca să fie clar programului când să animeze o coloană, acesta are nevoie de un mod de comunicare cu obiectul Player.h. Aceasta se face în metoda de actualizare a datelor, și anume în parametrul metodei de actualizare Update() se transmite poziția obiectului Player.h. În așa mod am făcut ca coloanele să comunice cu player-ul.
Pentru sunete sunt folosite 3 fișiere:
- SoundEngine.h - Generează motor pentru ca să ruleze sunetele;
- AudioSource.h - Crează un obiect care încarcă un fișier cu sunet;
- WAVLoader.h - Funcție care permite citirea fișierelor sunet de tip WAV.
Aici nu am ce explica, din cauză că după citirea documentației librăriei OpenAL, totul va fi clar.
Pentru animațiile player-ului și coloanelor de fețe am făcut o clasă aparte care se află în fișierul Animation.h.
În Constants.h se află niște enumerații și variabile constante de care programul se folosește într-una.
Funcția main() din care totul începe să ruleze se află în fișierul fabe_app.cpp. Game.h păstrează în dânsul toate coloanele cu fețe și player-ul, la fel prin această clasă se verifică dacă se strânge o singură culoare pe prima poziție din coloane.
Asta este totul ce pot să zic aici despre codul sursă a prototipului. Restul deja va trebui singuri să vă uitați și să analizați ce "prostii" am scris :-P, link-ul la sursă se află aici: FABE-pre-alpha-source-code.zip.
P.S. Codul nu este bine comentat, așa că nu vă recomand să-l citiți. Mie mi-a fost lene să-l rescriu. :-P