Gameboy
Introducere
Ideea proiectului este proiectarea unei console de tip Gameboy. Aceasta va pune la dispozitia jucatorului 3 jocuri clasice: Flappy Bird, Pong, Breakout. Acesta se face util prin faptul ca poate reprezenta o sursa de entertainment.
Descriere generală
Schema Bloc
Descriere elemente:
Breadboard: este platforma pe care voi construi circuitul, oferind conexiuni intre componentele folosite.
Arduino UNO ATmega328P: este creierul sistemului, gestionând logica si interacțiunea cu componentele.
Display Matrix 8×8 LED: este ecranul principal al Gameboy-ului.
Butoane: sunt interfața principala de control, permitand user-ului să interacționeze cu jocul.
Jump Wires: sunt cabluri flexibile folosite pentru a face conexiuni intre componente pe breadboard.
Speaker: furnizeaza sunete și efecte audio pentru a îmbunatati experiența de joc.
User: este persoana care va interacționa cu consola.
Hardware Design
Listă de piese
Componenta | Cantitate | Imagine | Descriere |
Arduino Uno ATmega328p | 1 | | Reprezinta creierul din spatele joculetelor |
Display Matrix LED 8×8 7219 | 1 | | Componenta pe care se vor afisa jocurile |
Breadboard | 1 | | Ofera conectivitatea intre componente |
Jump Wires | 13 | | Fac conexiunea intre componentele de pe breadboard si microcontroller, precum si conexiunea cu display-ul |
Butoane | 3 | | Interfata prin care user-ul interactioneaza cu dispozitivul |
Led | 2 | | Mod de reprezentare a unor mecanici din joc |
Baterie 9V | 1 | | Componenta cu care ofer viata gameboy-ului |
Scheme electrice
Pini folositi
pentru Arduino UNO:
2, 3, 4 - pentru cele 3 butoane
5, 6 - pentru LED-uri
8, 9, 10 - pentru a conecta pinii CIN, CS, CLK de pe matrix led
GND - pentru a conecta ground-ul de pe matrix led si cel de pe breadboard
5V - pentru a conecta la VCC de pe matrix led
Software Design
Descrierea codului aplicaţiei (firmware):
Surse
Locul unde implementez meniul prinicipal alaturi de instantierea pin-urilor folositi, precum si a unor varabile de control
care permit fluidizarea jocului.
Functii:
setup() - aceasta initializeaza pin-urile pentru butoane cat si pentru led-uri ( pentru care am folosit input de pullup ); pregateste random seed-ul pentru generarea random a variabilelor din program, si apeleaza setup-urile jocurilor.
loop() - functia principala, care verifica tipul jocului urmand sa apeleze functiile necesare jocului selectat. De asemenea acesta, goleseste display-ul in momenetul in care jucatorul pierde la unul din jocuri, afisand un emoji corespunzator, urmand ca dupa un delay de cateva secunde sa revina in meniul principal
changeGame() - se ocupa se selectarea jocului
drawEnd(), drawBird(), drawSimon(), drawBreakout() - functii de afisare
Sursa ce contine implementarea mecanicilor referitoare la primul joc, Flappy Bird. Aici se folosesc algoritmi de deboucing pentru
butoane astfel incat sa preiau doar semnalele importante.
Functii:
SetupGameF() - functia care initializeaza structura Bird, varabilele jocului, precum si pozitia initiala a jucatorului
moveBird() - se ocupa de controlul personajului, astfel ca prin algoritmi de deboucing se efectueaza corect citirea semnalelor provenite
din apasarea butonului de jump
switchWall(), doWall() - se ocupa de generarea random a obstacolelor
adjustGameDifficultyF() - mareste sau scade dificultatea jocului in functie de un anumit timp
checkCollisionF() - verifica coliziunea cu obstacolele, aceasta decide finalul jocului
Implementeaza jocul Breakout, folosind algoritmi pentru dinamica mingii, bouncing random din pereti si obstacole, selectarea la intamplarea a unuia din cele 3 nivele.
Functii:
setupGameB() - initializeaza matricea corespunzatoarea fiecarui nivel selectat random, pozitia initiala a jucatorului si a mingii, precum si alte variabile ce tin de directia mingii
drawLevel() - deseneaza nivelul selectat anterior
movePlayer() - functia ce se ocupa de controlul jucatorului, precum si a schimbarii directiei mingii in momentul in care acesta loveste
mingea cu una din cele 3 puncte
drawPlayerB() - deseneaza pozitia jucatorului pe tot parcusul jocului
moveBallB() - manevreaza mingea in functie de directie. Verifica modul in care aceasta face bounce in urma a 3 tipuri de coliziune:
player, wall si block.
checkBlockBallCollision() - verifica daca mingea are coliziune cu unul din obstacole, moment in care mingea poate ricosa stanga sau dreapta.
checkWallBallCollision() - verifica daca mingea are coliziune cu peretii astfel: daca este vorba de unul dintre peretii stanga, dreapta, atunci mingea va ricosa in directia opusa, in schimb daca loveste peretele de sus va ricosa random.
checkPlayerBallCollision() - verifica punctul in care mingea are coliziune cu jucatorul, moment ce decide directia in care mingea se deplaseaza, astfel ca daca mingea atinge punctul din stanga al jucatorului, va ricosa in stanga; daca loveste punctul din mijloc ricoseaza pe directie dreapta; iar daca loveste punctul din dreapta va ricosa in dreapta
Aceasta sursa contine implementarea jocului Simon Says, prin declararea a doua array-uri, unul care retine alegerile random ale jocului, iar celalalt alegerile jucatorului.
Functii:
setupGameS() - initializeaza varabilele caracteristice acestui joc, precum si a array-urilor ce retin alegerile jocului generate random
startCounting() - afiseaza numaratoarea ce reprezinta start-ul jocului
drawChoices() - afiseaza alegerile jocului prin sageti in 4 directii
drawPlayerChoices() - afiseaza alegerile jucatorului
playGameS() - functia principala in care sunt apelate celalte functii necesare jocului, locul unde se verifica daca jucatorul poate continua sau s-a terminat jocul. Aici se verifica ce buton este apasat, si daca prin apasarea butonului de pe pin-ul 8, se schimba directia unui din cele 2 butoane care initial sunt dreapta, sus.
makePlayerChoices() - verifica daca jucatorul a ales corect si poate continua, altfel jocul se incheie.
checkGameState() - se ocupa de aprinderea led-urilor, cel rosu pentru semnalizarea faptului ca este timpul jocului de alegere, si cel verde care indica faptul ca functionalitatea unui buton a fost schimbata.
drawL(), drawR(), drawU(), drawD() - functiile care se ocupa de afisarea alegerilor
Rezultate Obţinute
Download
Jurnal
5 Mai: Creare pagina OCW
10 Mai: Incepe montare componente
11 Mai: Start creare joc Flappy Bird
13 Mai: Pas avansat in crearea primului joc Flappy Bird:
Generare obstacole random
Cresterea dificultatii de obstacole
Controlul jucatorului printr-un buton
15 Mai: Finalizarea primului joc:
22 Mai: Finalizare proiect
Demo-uri:
Bibliografie/Resurse