This shows you the differences between two versions of the page.
pm:prj2025:avaduva:ana_bianca.savin [2025/05/23 21:12] ana_bianca.savin [Software Design] |
pm:prj2025:avaduva:ana_bianca.savin [2025/05/23 23:03] (current) ana_bianca.savin [Bibliografie/Resurse] |
||
---|---|---|---|
Line 73: | Line 73: | ||
În funcţia de setup, am iniţializat ecranul, iar apoi pinul pentru buton ca INPUT, cel pentru buzzer şi cel pentru modulul de card SD ca OUTPUT. | În funcţia de setup, am iniţializat ecranul, iar apoi pinul pentru buton ca INPUT, cel pentru buzzer şi cel pentru modulul de card SD ca OUTPUT. | ||
- | Jocul are un splash screen ce este randat înainte să se apese butonul. In funcţia de loop, se verifică constant dacă butonl se apasă sau nu. Când acesta este apăsat, variabila bool splashScreen ia valoare fals, iar jocul începe. Jucătorul controlează prin buton când sare dinozaurul. Acesta este mereu plasat la poziţia 0 pe hartă. Pentru a face delimitarea între cadre, am folosit funcţia delay astfel: delay(200 - (score * 3)). În acest mod, cu cât scorul este mai mare, cu atât jocul se mişcă mai repede. | + | Jocul are un splash screen ce este randat înainte să se apese butonul. In funcţia de loop, se verifică constant dacă butonl se apasă sau nu. Când acesta este apăsat, variabila bool splashScreen ia valoare fals, iar jocul începe. Jucătorul controlează prin buton când sare dinozaurul. Acesta este mereu plasat la poziţia 0 pe hartă. Pentru a face delimitarea între cadre, am folosit funcţia delay astfel: delay(200 - (score * 2)). În acest mod, cu cât scorul este mai mare, cu atât jocul se mişcă mai repede. |
Line 81: | Line 81: | ||
Dinozaurul sare când jucătorul apasă butonul. Prin sărit ne referim la faptul că el va înainta pe rândul 2 în loc de rândul 3. Am făcut saltul sa îl imite cât mai aproape pe cel dintr-ul joc video real. Astfel, saltul are o durata predefinită ce este obţinută prin folosirea funcţiei millis. Ea returnează numărul de milisecunde care a trecut de când a fost pornit programul. Astfel, când butonul apăsat reţinem valoarea funcţiei millis şi mutăm jucătorul pe rândul 2. În loop verificăm dacă valoarea actuală a funcţiei millis minus valoarea reţinută în momentul efectuării saltului este mai mare decât durata saltului 500. | Dinozaurul sare când jucătorul apasă butonul. Prin sărit ne referim la faptul că el va înainta pe rândul 2 în loc de rândul 3. Am făcut saltul sa îl imite cât mai aproape pe cel dintr-ul joc video real. Astfel, saltul are o durata predefinită ce este obţinută prin folosirea funcţiei millis. Ea returnează numărul de milisecunde care a trecut de când a fost pornit programul. Astfel, când butonul apăsat reţinem valoarea funcţiei millis şi mutăm jucătorul pe rândul 2. În loop verificăm dacă valoarea actuală a funcţiei millis minus valoarea reţinută în momentul efectuării saltului este mai mare decât durata saltului 500. | ||
- | Totuşi jucătorul poate sări constant ceea ce nu este bine. Pentru a rezolva problema, am implementat un cooldown pentru salt. Astfel, în loop se va face încă o verificare: dacă millis minus valoarea ei reţinută în momentul când s-a efectuat saltul este mai mare decât valoarea cooldown-ului 1000. Valoarea aceasta trebuie sa fie mai mare decât cea care denotă lungimea saltului, deoarece timpul de cooldown efectiv în care jucătorul este pe pomânt şi nu poate să sară este 1000 - 500 = 500. | + | Totuşi jucătorul poate sări constant ceea ce nu este bine. Pentru a rezolva problema, am implementat un cooldown pentru salt. Astfel, în loop se va face încă o verificare: dacă millis minus valoarea ei reţinută în momentul când s-a efectuat saltul este mai mare decât valoarea cooldown-ului 1000. Valoarea aceasta trebuie sa fie mai mare decât cea care denotă lungimea saltului, deoarece timpul de cooldown efectiv în care jucătorul este pe pomânt şi nu poate să sară este 1000 - 500 = 500. Folosim o variabilă bool canJump care este falsă de când se efectuează saltul până când condiţia descrisă devine adevărată. |
**Obstacole** | **Obstacole** | ||
- | La fiecare cadru obstacolele se apropie de dinozaur, prin randarea lor la poziţia anterioară minus 1. Obstacolele sunt de 2 feluri: cactuşii, care sunt pe nivelul pământului şi păsările, care sunt pe nivelul saltului. Pentru a face jocul sa fie echilibrat, am decis ca, la un moment dat, pe ecran pot sa fie maxim 2 cactuşi şi o pasăre. Astfel, trei variabile care reţin poziţia fiecăreia dintre ele. Am încercat să simulez generarea random a obstacolelor. Astfel, când există doar un cactus în scenă, cu cât acesta se apropie de dinozaur, cu atât şansa să vina în scena cel de al doilea cactus creşte. Dacă un cactus ajunge pe poziţia 1, lângă jucător (care este mereu pe 0), fără ca un al doilea cactus sa fi intrat în scenă, acesta va apărea garantat pentru a menţine ciclul. Pentru pasăre, am decis să existe o şansă de 15% ca ea să apară în orice cadru în care nu există deja şi în care cei doi cactuşi au poziţia mai mică decât 15. Această condiţie asigură că pasărea nu poate apărea deasupra unui cactus, astfel făcând rezolvarea imposibilă. | + | La fiecare cadru obstacolele se apropie de dinozaur, prin randarea lor la poziţia anterioară minus 1. Obstacolele sunt de 2 feluri: cactuşii, care sunt pe nivelul pământului şi păsările, care sunt pe nivelul saltului. Pentru a face jocul sa fie echilibrat, am decis ca, la un moment dat, pe ecran pot sa fie maxim 2 cactuşi şi o pasăre. Astfel, trei variabile care reţin poziţia fiecăreia dintre ele. Am încercat să simulez generarea random a obstacolelor. Astfel, când există doar un cactus în scenă, cu cât acesta se apropie de dinozaur, cu atât şansa să vina în scena cel de al doilea cactus creşte. Dacă un cactus ajunge pe poziţia 1, lângă jucător (care este mereu pe 0), fără ca un al doilea cactus sa fi intrat în scenă, acesta va apărea garantat pentru a menţine ciclul. Pentru pasăre, am decis să existe o şansă de 15% ca ea să apară în orice cadru în care nu există deja şi în care cei doi cactuşi au poziţia mai mică decât 15 şi poziţia lor nu este cea mai din dreapta (cazul în care tocmai au apărut). Această condiţie asigură că pasărea nu poate apărea deasupra unui cactus, astfel făcând rezolvarea imposibilă. |
Pentru a testa coloziunea dintre dinozaur şi obstacole, în fiecare cadru se verifică: | Pentru a testa coloziunea dintre dinozaur şi obstacole, în fiecare cadru se verifică: | ||
Line 110: | Line 110: | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | Proiectul cu bateria conectată: |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | {{:pm:prj2025:avaduva:savin_ana_bianca_fara_cutie.jpeg?200|}} |
+ | |||
+ | Proiectul aşezat într-o cutie astfel încât doar ecranul, buzzer-ul şi butonul să fie vizibile: | ||
+ | |||
+ | {{:pm:prj2025:avaduva:savin_ana_bianca_in_cutie.jpeg?200|}} | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Nu am mai folosit Arduino deloc înainte de a realiza acest proiect, deci pot spune că am învăţat multe de la comanda pieselor potrivite până la scrierea codului. |
- | <note warning> | + | Majoritatea lucrurilor nu am mers din prima şi a fost nevoie de mult căutat pe Internet şi debugging. Unul dintre primele lucruri la care m-am blocat a fost faptul ca trebuia să înşurubez puţin şurubul de pe spatele I2C-ului de pe ecran, pentru a vedea bine. |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | Totuşi să duc până la capăt proiectul a fost satisfăcător, mai ales când pot să îl folosesc la final. |
- | </note> | + | |
- | ===== Jurnal ===== | + | Link demo: https://youtu.be/PXyI-jHPegI |
+ | |||
+ | |||
+ | ===== Download ===== | ||
+ | |||
+ | Arhiva cu codul: {{:pm:prj2025:avaduva:savin_ana_bianca_dino_endless_runner.zip|}} | ||
- | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
- | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | Resurse hardware: |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * https://lastminuteengineers.com/arduino-micro-sd-card-module-tutorial/ |
- | </note> | + | * https://docs.arduino.cc/built-in-examples/digital/Button/ |
+ | * https://lastminuteengineers.com/i2c-lcd-arduino-tutorial/ | ||
+ | |||
+ | |||
+ | Resurse software: | ||
+ | * https://gist.github.com/mikeputnam/2820675 | ||
+ | * https://www.engineersgarage.com/how-to-create-custom-characters-on-lcd-using-arduino-part-5-49/ | ||
+ | |||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||
+ | |||