This is an old revision of the document!
În acest proiect, voi folosi Arduino Uno împreună cu un display LCD și alte componente (precum un joystick şi un buzzer pasiv pentru redare de sunete) pentru a crea un mic joc de tip Space Invaders. Acest joc va permite utilizatorului să controleze o navă spaţială care se poate mișca în stânga și în dreapta, trăgând proiectile pentru a distruge navele invadatoare. De asemenea, voi integra un sistem de leaderboard care va stoca scorurile pe un card SD, permițând astfel jucătorului să își înregistreze performanțele.
Ideea proiectului a plecat de la pasiunea mea pentru jocuri video, care m-a introdus înca de mic în lumea programării şi a tehnologiei în general. Un factor ce a contribuit la alegerea acestei teme a fost curiozitatea mea legată de “cum sunt făcute jocurile”, atât din punct de vedere software, cât şi hardware.
Pentru realizarea proiectului, am folosit următoarele componente:
Modulul pentru citirea cardului SD foloseşte protocolul de comunicaţie SPI. Modulul Joystick foloseşte 3 conexiuni, două analogice (pentru măsurarea înclinaţiei joystick-ului pe axele Ox şi Oy, mişcând nava spaţială) şi una digitală (apăsarea butonului joystick-ului, ce va face ca nava să tragă cu proiectile).
Biblioteci folosite:
Detalii despre implementare şi fluxul programului:
La pornirea jocului, jucătorul este întâmpinat de un title-screen care se glisează din partea dreaptă, în timp ce o scurtă melodie de bun venit este emisă de buzzer-ul pasiv. Pe urmă, jucătorul este trimis în meniul principal, de unde poate alege să joace sau să consulte leaderboard-ul. Pentru a naviga în meniu, jucătorul foloseşte joystick-ul.
La alegerea opţiunii “Leaderboard”, <TODO>.
La alegerea opţiunii “Play”, jucătorul va avea de eliminat 5 valuri de nave extraterestre, unde fiecare nivel are un nivel de dificultate diferit (mai mulţi inamici/inamici mai rapizi). La finalul celor 5 valuri, jucătorul primeşte un mesaj de victorie şi îi este calculat timpul în care a reuşit să elimine inamicii.
Pentru desenarea spaţiului de joc, am împărţit la nivel logic rândurile display-ului în câte două rânduri mai mici, astfel obţinând o hartă de 16×4. La fiecare “frame”, este parcursă o matrice de 16×4 a căror valori indică daca spaţiul reprezintă nava jucătorului, o navă extraterestră, un proiectil sau un spaţiu liber.
Logica meniului principal este descrisă în funcţia loop(), care fie afişează meniul curent, fie apelează funcţia play(), unde este implementată logica jocului (funcţie care foloseşte, la rândul ei, alte funcţii menite să modularizeze structura codului pentru a fi uşor de urmărit).