Retro Chicken Invaders

Maria Teodor - 336CB

Introducere

Am dorit sa fac un proiect pe care sa il poata aprecia si persoanele care nu sunt la aceeasi facultate, iar ideea pe care am pastrat-o a fost cea a unui joc de arcada, asemanator cu Chicken Invaders, un joc pe care majoritatea persoanelor din generatia mea l-au jucat cu placere cand erau mai mici. Considerand faptul ca acest joc e inspirat de jocul Space Invaders, proiectul va fi o combinatie dintre cele doua. Acest proiect este util pentru a imi distra prietenii cu inca ceva ce am facut in cadrul acestei facultati.

Descriere generală

In principal, jucatorul se va putea misca stanga-dreapta cu ajutorul unui joystick, avand un buton pe care va apasa pentru a trage in inamici. Vor exista mai multe nivele, cu cate o dificulate diferita. Omorand inamici, jucatorul va castiga puncte, iar la final scorul sau va fi afisat pe ecran, pentru a fi motivat sa se joace mai mult pentru a-si intrece recordul, sau pentru a-si intrece prietenii.

Buzzer-ul va acompania sonor jocul, pentru a oferi o experienta mai placuta jucatorului.

Hardware Design

Componentele folosite vor fi:

  • Arduino NANO
  • Ecran LCD 2004
  • Potentiometru
  • Joystick
  • Buzzer
  • Placa prototipare cablaj
  • Fire

Am incercat sa asamblez proiectul astfel incat sa fie usor de tinut in mana, pentru a duce la o experienta a jucatorului mai placuta. Am lipit componentele de o placa de prototipare cablaj, ascunzand buzzer-ul in spatele ecranului. Mi-am exersat abilitatile de lipit componente deprinse in vara de dupa anul intai, cand, in cadrului unui internship, am parcurs mai multe laboratoare de SMP, fiind nevoita sa lipesc pini pe majoritatea pieselor folosite. Pentru a fixa mai bine joystick-ul, am folosit doua suruburi cu care l-am prins de placa. Cat sa fie un design cat mai portabil, pana la urma am optat pentru a folosi un Arduino NANO.

Software Design

  • Medii de dezvoltare: Arduino IDE
  • Librarii Arduino IDE utilizate pentru: LCD

Spre dezamagirea mea, ecranul pe care l-am folosit este limitat la 8 caractere speciale, deci nu am reusit sa afisez mesaje precum “GAME OVER”, nivelul curent si scorul final decat rotite la 90 de grade fata de orientarea ecranului. De asemenea spre dezamagirea mea, e imposibil sa reproduci un sunet de gaina cu buzzer-ul pe care l-am folosit (cel mai basic, nu stiu daca chiar e imposibil sau doar )

Am structurat nivelele de dificultate in functie de urmatoarele criterii: numarul de gloante pe care le poate trage jucatorul, numarul maxim de inamici ce se pot afla la un moment dat pe ecran, si functia de generare a inamicilor, fiind in total trei astfel de functii. In plus, in urma terminarii nivelului 3, numarul de frame-uri pe secunda creste de la 2 la 3.

Petru a calcula scorul, am folosit o formula ce ia in considerare numarul de inamici omorati, nivelul curent, cat si pozitia jucatorului in momentul mortii. Astfel, jucatorul este motivat sa nu stea doar pe randul cel mai de jos, putand sa castige mult mai multe puncte daca se deplaseaza in pozitii cat mai periculoase.

Functiile de baza pe care-am folosit sunt:

  • update() - functie apelata in cazul in care in care jocul este in statusul RUNNING
  • updateState() - functie care modifica starea majoritatea variabilelor care determina starea jocului, distrugand inamicii si gloantele care ies din ecran si citind input-ul primit de la joystick
  • shoot() - determina ce se intampla cand e apasat butonul de pe joystick
  • generateEnemy(), generateEnemyHarder() si generateEnemyImpossible() - cele trei functii de generare a inamicilor
  • generateBullet() - functie de generare a gloantelor
  • reset() - functie apelata dupa ce jucatorul pierde
  • drawScreen() - functie in care se deseneaza tot pe ecran
  • collision() - functie care determina daca 2 obiecte au aceeasi pozitie
  • destroyBullet(), destroyEnemy() - scot glondul/inamicul din vectorul corespunzator.

Rezultate Obţinute

In prima poza se poate observa cablajul din spatele proectului, remarcandu-se prezenta unui buzzer in spatele ecranului (nu am mintit).

In a doua poza se poate vedea ca e la fel de frumos si in fata.

Recomand sa incercati sa jucati jocul, prin expertiza programatorului am avut un scor maxim de 4037 si vreo ora facand asta si enervandu-mi prietenii cu care eram in camera.

Concluzii

Folosind notiunile invatate la PM, mai exact cele privind PWM, intreruperi hardware si ADC, am reusit sa intocmesc un joc ce imi va surprinde prietenii si parintii care se vor gandi “asta nu e la fel de amuzant ca jocul cu masinute pe care l-a facut in semestrul 1”. Nu este cel mai inventiv proiect intalnit, insa se descurca okay la ceea ce ar trebui sa faca.

Jurnal

  • 08.03.2023: M-am intalnit cu sora mea mai mare cat sa imi cedeze toate componentele pe care le mai avea prin casa
  • 22.04.2023: Am vorbit cu Ionut cat sa ma asigur ca tema aleasa e okay
  • 23.04.2023: Am uitat complet de proiect pentru urmatoarele 2 saptamani
  • 09.05.2023: Am creat pagina de ocw si am adaugat introducerea si descrierea generala, si am incercat sa fac o prima schema hardware
  • 09.05.2023: Au sosit piesele care imi mai lipseau
  • 19.05.2023: M-am hotarat ca ar fi mai okay sa folosesc un Arduino NANO decat unul UNO, am facut rost de unul
  • 20.05.2023: Am vizitat un prieten de-al surorii mele si am lipit la statia lui de lipit totul, am terminat partea de hardware si m-am apucat sa scriu partea de software
  • 21.05.2023: Am terminat partea de software
  • 28.05.2023: Am terminat pagina de ocw

Demo

Download

Bibliografie/Resurse

pm/prj2023/iotelea/chicken-invaders.txt · Last modified: 2023/05/30 01:24 by maria.teodor
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