Pong
Introducere
Tema proiectului este crearea unui joc Pong ce poate fi jucat de 2 jucatori pe un ecran OLED.
Este un joc asemanator cu ping-pong-ul in care fiecare jucatorul controleaza o paleta folosind un potentiometru.
La pornirea programului, se va afisa un ecran de “welcome”, iar jocul incepe cand se detecteaza input.
Descriere generala
Functionalitate
Programul incepe prin afisarea unui ecran de start, timp in care se asteapta input din partea potentiometrelor. Odata ce acestea au fost miscate suficient, jocul incepe. Fiecare potentiometru controleaza paleta sa respectiva. La fiecare 5 lovituri ale mingii (adunate de la ambii jucatori), viteaza mingii creste, pentru ca jocul sa nu stagneze. Odata marcat un punct, LED-ul jucatorului care a marcat se aprinde si buzzer-ul face un sunet, iar viteza se reseteaza. Jocul continua pana cand un jucator atinge 5 puncte, dupa care este afisat un ecran cu castigatorul, iar LED-ul sau palpaie. Jocul poate reincepe daca se primeste, din nou, input de la potentiometre.
Schema bloc
Hardware Design
Componente
Arduino Nano
Breadboard
2 potentiometre
Display OLED 0.96” I2C
Fire
Buzzer
2 rezistente 220 Ohmi
2 LED-uri
Schema electrica
Conectare fizica
Software Design
Mediu de dezvoltare
Biblioteci
Adafruit_SSD1306 — Biblioteca driver pentru display-uri OLED monocromate de tipul SSD1306.
Adafruit GFX — Contine o multitudine de functii pentru manipularea pixelilor display-urilor.
Functii
setup()
Seteaza pinii LED-urilor ca OUTPUT.
Initializeaza display-ul OLED.
Afiseaza ecranul de splash.
splash()
Afiseaza ecranul de splash folosind functii din biblioteca Adafruit GFX.
Asteapta input din partea potentiometrelor pentru a incepe jocul.
Porneste un sunet de start odata ce a primit input.
centerPrint()
printText()
calculateMovement()
Calculeaza pozitia mingii si a paletelor (in functie de inputul oferit de potentiometre).
Verifica coliziunea mingii cu paletele, caz in care inverseaza sensul acesteia.
Verifica daca mingea a trecut de una din palete, caz in care adauga un punct jucatorului respectiv.
Verifica daca jocul a fost castigat de vreun jucator, apeland functia hasWon(CULOARE) daca este cazul.
hasWon()
Afiseaza un ecran ce anunta jucatorul care a castigat.
Aprinde si stinge incontinuu LED-ul acestuia, asteptand input de la potentiometre pentru a incepe un nou joc.
draw()
Afiseaza fiecare element al jocului pe ecran.
Aceste elemente sunt: terenul (format dintr un chenar dreptunghiular, o linie verticala punctata aflata la mijloc, scorurile jucatorilor) si paletele.
addEffect()
Aceasta functie adauga “efect” mingii daca aceasta este lovita de o paleta in miscare.
Acest efect reprezinta marirea sau micsorarea vitezei pe axa Y a mingii, in functie de cum a fost lovita de paleta.
Rezultate obtinute
In final, am obtinut clasicul joc de Pong cu o interfata similara cu cea regasita pe consola de jocuri Atari, complet functional si cu cateva feature-uri in plus.
Este de asemenea foarte compact, putand fi usor pus intr-o cutie alaturi de o baterie si folosit ca si joc handheld.
Demo
Derularea jocului
Ecran castigator
Concluzii
Proiectul functioneaza si obtine rezultatele asteptate.
Potentiometrele muta paletele cu acuratete.
Nu a necesitat multe piese.
Jocul se misca intr-un frame-rate bun, foarte jucabil.
Se aseamana foarte mult cu jocul clasic de Pong.
Datorita folosirii Arduino Nano, acesta este compact si portabil.
Download
Jurnal
25/4: crearea paginii Wiki, descriere, diagrama bloc.
7/5: achizitionarea componentelor.
11/5: asamblarea componentelor.
14/5: scrierea logicii de baza si afisarea.
15/5: adaugarea ecranului de splash si a celui de victorie.
18/5: adaugarea functionalitatii de “efect”.
1/6: curatarea codului.
2/6: finalizarea paginii Wiki.
Bibliografie/Resurse