This shows you the differences between two versions of the page.
pm:prj2024:iotelea:ana.glodariu [2024/05/25 14:49] ana.glodariu [Rezultate Obţinute] |
pm:prj2024:iotelea:ana.glodariu [2024/05/25 22:41] (current) ana.glodariu [Download] |
||
---|---|---|---|
Line 100: | Line 100: | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | ||
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | ||
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | ||
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | ||
- | * (etapa 3) surse şi funcţii implementate | ||
- | </note> | ||
- | |||
* mediu de dezvoltare: Arduino IDE | * mediu de dezvoltare: Arduino IDE | ||
* librării şi surse 3rd-party: | * librării şi surse 3rd-party: | ||
Line 115: | Line 107: | ||
* Adafruit_SSD1306.h -> pentru ecranul oled | * Adafruit_SSD1306.h -> pentru ecranul oled | ||
* MD_MAX72xx.h ->pentru matricea de leduri | * MD_MAX72xx.h ->pentru matricea de leduri | ||
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi: | + | * algoritmi şi structuri pe care plănuiesc să le implementez: |
* inițializarea matricei de joc cu monstrul, chest-ul | * inițializarea matricei de joc cu monstrul, chest-ul | ||
* update-ul lumii cu poziția curentă a jucătorului și drumul parcurs până atunci | * update-ul lumii cu poziția curentă a jucătorului și drumul parcurs până atunci | ||
Line 121: | Line 113: | ||
* timer-ul implementat crește dificultatea jocului - jucătorul având un timp limitat pentru a omorî monstrul | * timer-ul implementat crește dificultatea jocului - jucătorul având un timp limitat pentru a omorî monstrul | ||
* afișarea timer-ului pe ecran | * afișarea timer-ului pe ecran | ||
+ | |||
+ | În funcția de setup setez pinii, inițializez matricea de led-uri, ecranul OLED și creez harta - adică plasez monstrul și chest-ul într-o poziție random. Jucătorul va fi plasat la începutul fiecărui joc în colțul stânga jos. | ||
+ | |||
+ | Pentru funcția de switch al joystick-ului am creeat o **întrerupere**, care va avea loc de fiecare dată când apăs pe joystick. | ||
+ | |||
+ | Pentru **timer** configurez Timer0 al plăcuței pentru a funcționa în modul CTC (Clear Timer on Compare Match), setează un prescaler de 64 și configurează timerul pentru a genera o întrerupere la fiecare 1 milisecundă. | ||
+ | |||
+ | Pentru ca jucătorul să se deplaseze am definit funcția **getDirection** care primește inputul de la pinii VRX și VRY ai joystick-ului, și în funcție de valorile analogice primite întoarce una dintre direcțiile sus, jos, stânga, dreapta. | ||
+ | |||
+ | Funcția **dangerZone()** alertează jucătorul când se află în apropierea monstrului cu ajutorul buzzer-ului și al ecranului OLED. | ||
+ | |||
+ | Funcția **chestZone()** alertează jucătorul când se află în apropierea cufărului cu ajutorul buzzer-ului și al ecranului OLED. | ||
+ | |||
+ | Funcția **checkHazard()** verifică dacă jucătorul a picat fix pe poziția monstrului. | ||
+ | |||
+ | Funcția **checkLoot()** verifică dacă jucătorul a colectat arma din cufăr. | ||
+ | |||
+ | Am definite niște variabile de tip bool și în funcție de valoarea lor, pe ecran va apărea o imagine cu eroul, prințesa (în cazul în care câștigă), cufărul (când se află în preajma lui), sabia (când deschide cufărul), monstrul (când se află în preajma lui) sau un mormânt (cănd eroul este mâncat de monstru). Imaginile pixelate au fost create în GIMP și după convertite în bitmap cu ajutorul site-ului: | ||
+ | https://javl.github.io/image2cpp/ | ||
+ | |||
+ | Eroul **pierde** jocul în următoarele situații: | ||
+ | * a rămas fără timp (au trecut 60 de secunde) | ||
+ | * a încercat să lovească monstrul și nu l-a nimerit (monstrul are un auz foarte dezvoltat și va veni să atace eroul, astfel va fi omorât) | ||
+ | * a încercat să atace monstrul fără o armă | ||
+ | * dă de monstru fără să-l atace | ||
+ | |||
+ | Eroul **câștigă** jocul dacă localizează mai întăi arma, iar odată localizat și monstrul va trebui să lovească în sensul și direcția lui. Pentru a ne da seama în ce sens lovește eroul, în cod reținem în variabila __lastMove__ sensul din care vine jucătorul înspre monstru (de sus, de jos, din stânga sau din dreapta). Eroul trebuie să omoare monstrul în timpul alocat pentru a câștiga. | ||
+ | |||
+ | De fiecare dată când jucătorul pierde sau câștigă, **jocul se resetează**. | ||
+ | * __void(* reset) (void) = 0;__ = declanșează execuția codului de la adresa 0, ce este echivalentă cu o resetare a sistemului. | ||
+ | |||
+ | Pentru afișarea drumului parcurs de jucător folosesc o matrice de 8x8, pozițiile vizitate luând valoarea 1, iar pentru ca jucătorul să știe poziția curentă, led-ul pe care se află va clipi. | ||
+ | |||
+ | De asemenea, ca atunci când jucătorul se mișcă stânga, dreapta, sus sau jos, acesta să se deplaseze cu o singură poziție în sensul corespunzător, am simulat un delay de o secundă între 2 deplasări, folosindu-mă de contorul utilizat la timer (contorul este incrementat de fiecare dată când întreruperea este generată). | ||
+ | |||
+ | |||
+ | |||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | ==Rezultat final:== |
- | Rezultat final: https://drive.google.com/file/d/1-zmoEcbHJrUvFPrIUK8Y_qhrAqo7qiL4/view?usp=sharing | + | https://drive.google.com/file/d/1-zmoEcbHJrUvFPrIUK8Y_qhrAqo7qiL4/view?usp=sharing |
- | </note> | + | |
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul ar putea fi puțin mai complex din punct de vedere al numărului de monștri sau prin adăugarea de animații pe ecranul OLED (asta ținând cont și de spațiul de stocare al programului (flash-ul) și de memoria dinamică folosită) - programul meu curent deja ocupând destul de mult: | ||
+ | * //'Sketch uses 23548 bytes (72%) of program storage space. Maximum is 32384 bytes.'// | ||
+ | * //'Global variables use 856 bytes (41%) of dynamic memory, leaving 1192 bytes for local variables. Maximum is 2048 bytes.'// | ||
- | ===== Download ===== | + | De asemenea, am întâmpinat probleme din cauza folosirii timer-ului 0, pentru că nu am mai putut folosi funcția de delay() și nici millis(), de care aș fi avut nevoie la creearea sunetelor cu ajutorul buzzer-ului, la care am găsit o alternativă nu atât de bună (zic eu) - generam o anumită frecvență pe un interval determinat de valoarea contorului. |
+ | Cu toate acestea, chiar dacă am întâmpinat unele probleme, a fost plăcut să gasesc soluții la ele de una singură. | ||
+ | {{:pm:prj2024:huntorbehunted.zip|}} | ||
+ | ===== Download ===== | ||
+ | {{:pm:prj2024:huntorbehunted.zip|}} | ||
+ | (arhiva încă conține cod pentru afișări de date seriale în cazul în care mai e nevoie de debugging) | ||
<note warning> | <note warning> | ||
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ă ;-). | 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ă ;-). |