Table of Contents

Endless Run

Autor: Rareș-Adrian Roșca

Grupa: 333CD

Introducere

Proiectul consta intr-un joc de tip runner. Jucatorul poate controla personajul principal care se afla in continua miscare, fiind necesar sa evite toate obstacolele din drum. Daca jucatorul este lovit de trei obstacole, run-ul curent se va opri brusc, iar personajul va fi plasat la inceputul jocului.

Scopul este de a ajunge cat mai departe, colectand mai multe puncte decat in incercarile precedente. Pentru a accentua nivelul de dificultate si pentru a mentine interesul jucatorului, jocul devine din ce in ce mai rapid pe masura ce timpul petrecut in el creste.

Descriere generală

Jocul are o interfata 2D ce este afisata pe un ecran LCD. Intreaga interactiune cu jocul se realizeaza prin intermediul unui joystick. Dupa apasarea butonului din joystick in interfata de start, jucatorul trebuie sa evite obstacolele generate intamplator, ce apar in mod continuu, folosindu-se de miscarile joystickului, prin care personajul poate sa sara sau sa atace inamicii care ii apar in cale. Odata ce timpul petrecut in joc creste, personajul devine mai rapid, fiind generate si mai multe obstacole. Prin miscarea in sus sau in jos, pot fi colectate puncte care apar intamplator si vor fi adunate la scorul final, determinand calitatea run-ului actual. Fara colectarea de puncte suplimentare, scorul este incrementat treptat. Aditional, este utilizat un buzzer pentru a reda diverse sunete din joc, iar cand personajul mai ramane cu o singura viata in run-ul actual, un led rosu se va aprinde pentru a spori nivelul de atentie al jucatorului. Odata ce o runda a fost terminata, exista posibilitatea de retry, de unde jucatorul va incepe de la viteza initiala a jocului cu scorul zero.

Hardware Design

Piesele necesare proiectului sunt:

Schema electrica:

Software Design

Mediul de dezvoltare folosit este Arduino IDE, impreuna cu bibliotecile TFT.h si SPI.h pentru a comunica prin SPI cu ecranul LCD. Restul componentele sunt controlate prin lucrul direct cu registrele microcontrollerului ATmega328P.

Terenul este reprezentat de un vector de caractere, in care, cu anumite probabilitati pot aparea si obstacole sau oportunitati de a colecta puncte. In functie de ce informatie se afla in acest vector, vor fi apelate functiile de draw implementate pentru a sterge elementele anterioare de pe ecran si pentru a le adauga pe cele noi. Personajul si terenul vor fi actualizate la fiecare frame, viteza cu care elementele isi realizeaza tranzitia pe ecran depinzand de variabila speedFactor, care este crescuta odata cu timpul petrecut in joc. Timpul in joc este obtinut prin functia myMillis, care este implementata cu ajutorul timerului 1 in modul CTC, avand activata si intreruperea corespunzatoare, unde se incrementeaza o variabila declarata volatile.

Pentru a detecta cand personajul este lovit, sunt create metode care detecteaza coliziunile in functie de valorile coordonatelor elementelor pe ecran. Jucatorul se poate apara de obstacole prin salt sau atac (miscare in sus sau dreapta). Astfel, outputul joystickului este citit in program cu ajutorul functiei myAnalogRead, prin ADC, care este intializat in setup. In cazul in care o coliziune a fost detectata, iar personajul nu are abilitatea de invincibilitate, acesta isi va pierde una din vieti. Acest lucru va fi vizibil si pe ecran, deoarece functia drawHearts realizeaza randarea a unui numar de inimi egal cu variabila lives, care este decrementata la aparitia unei coliziuni. In acelasi timp, buzzerul, care lucreaza in PWM, pe timer 0 (Fast PWM) va scoate sunete de pe doua frecvente diferite pentru a avertiza jucatorul. Daca personajul mai are o singura viata, LED-ul va fi aprins. Odata ce jucatorul si-a pierdut toate vietile, LCD-ul va mai arata ecranul de game over, continand scorul actual si cel mai bun scor obtinut. In aceasta stare, LED-ul rosu se aprinde intermitent, iar prin apasarea joystickului, se poate porni alt run, cu scorul resetat si toate elementele in alta ordine, fiind generate aleator.

Concluzii

Pentru a fi posibila comunicarea intre piesele care formeaza proiectul, au fost aplicate cunostinte obtinute din laboratoarele de GPIO, intreruperi, timere si ADC. In partea software de randare a elementelor jocului pe ecran, am experimentat cu diversi parametri din cod, cum ar fi viteza personajului sau rata cu care apar inamicii, pentru a observa ce nivel de dificultate este cat mai acceptabil. In acest fel, acumularea unui punctaj mare in joc va reprezenta o provocare, fara a deveni un obiectiv imposibil.

Bibliografie/Resurse