Pong

Autor: ENACHE Liviu

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

  • Arduino IDE 1.8.13
  • Fritzing (folosit pentru schema electrica)

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()

  • Functie ce face mai usoara afisarea de text pe centrul ecranului.

printText()

  • Functie ce face mai usoara afiseara de text la o anumita pozitie.

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

pm/prj2021/agrigore/pong.txt · Last modified: 2021/06/02 22:22 by liviu.enache0211
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0