This shows you the differences between two versions of the page.
|
pm:prj2025:rnedelcu:ioan_alexandru.popa [2025/05/28 15:50] ioan_alexandru.popa |
pm:prj2025:rnedelcu:ioan_alexandru.popa [2025/05/28 17:05] (current) ioan_alexandru.popa |
||
|---|---|---|---|
| Line 104: | Line 104: | ||
| * 4 vieți | * 4 vieți | ||
| * Controlezi o mașinuță ce trebuie să se ferească de zidurile de pe marginile drumului | * Controlezi o mașinuță ce trebuie să se ferească de zidurile de pe marginile drumului | ||
| - | * Stânga-dreapta, iar înainte mașinuța ia viteză | + | * Stânga-dreapta |
| + | * Mașinuța merge înainte la un interval de timp sau la joystick înainte | ||
| * Zidurile se schimbă periodic | * Zidurile se schimbă periodic | ||
| + | |||
| + | Meniul principal este, de asemenea implementat ca script JavaScript. | ||
| ==== Interfața JavaScript ==== | ==== Interfața JavaScript ==== | ||
| - | Jocurile trebuie să implementeze următoarele funcții, ce se apelează în cardul unor evenimente relevante în joc. | + | Jocurile au acces la 2 ecrane virtuale, cu celule indexate de la 0: |
| + | * Principal de 10x20 (pentru acțiunea jocului) | ||
| + | * Secundar de 4x4 (pentru afișarea unor detalii suplimentare, ex. numărul de vieți) | ||
| + | |||
| + | Ecranele au 3 culori: | ||
| + | * 0 = stins | ||
| + | * 1 = aprins (negru) | ||
| + | * 2 = parțial aprins (gri) | ||
| + | |||
| + | Există un sistem de tick-uri care se execută după fiecare ''TICK_TIME'' (500) milisecunde | ||
| + | |||
| + | Runtime-ul implementează următoarele funcții: | ||
| + | * ''brickVibrate(intensity: number, duration: number)'' - Motorul cu vibrații va vibra la intensitatea ''intensity'' (număr între 0 și 255; 255 = maxim, 180 = valoare intermediară bună) timp de ''duration'' milisecunde. | ||
| + | * ''brickMainDraw(x: number, y: number, color: number)'' - desenează pe ecranul principal la celula specificată (linia ''y'', coloana ''x'') culoarea specificată | ||
| + | * ''brickSecondaryDraw(x: number, y: number, color: number)'' - desenează pe ecranul principal la celula specificată (linia ''y'', coloana ''x'') culoarea specificată | ||
| + | * ''brickTickReset()'' - nu se va mai executa tick-ul următor, se va executa peste ''TICK_TIME'' milisecunde (dacă nu se mai apelează ''brickTickReset()'' încă o dată până atunci) | ||
| + | * ''brickGameOver(x: number, y: number, noRestart: boolean)'' - inițializează ecranul de game over cu „X”-ul în punctul specificat (linia ''y'', coloana ''x'') și vibrație maximă. După un timp se ve reporni jocul în același context (variabilele globale sunt păstrate, dar se va rula ''handleInit()'') dacă ''noRestart'' e ''false'', altfel se va reseta consola la meniul principal. | ||
| + | * ''brickLoad(gamePath: string)'' - încarcă jocul din calea specificată din sistemul de fișiere LittelFS încărcat pe plăcuță, resetând contextul JavaScript. Un API „intern”, nu e intenționată folosirea lui în jocuri, doar în meniul de start. | ||
| + | |||
| + | Jocurile trebuie să implementeze următoarele funcții, ce se apelează în cardul unor evenimente relevante în joc: | ||
| + | |||
| + | * ''handleInit()'' - se apelează inițializarea jocului la pornire sau după o pierdere de viață prin ''brickGameOver(x, y, false)''. Aici se inițializează variabilele ce indică starea vieții curente. Inițializarea numărului de vieți sau alte chestii ce se păstrează de-a lungul vieților se face direct în corpul scriptului. | ||
| + | * ''handleTick()'' - se apelează la fiecare tick - bun pentru aplicarea mișcărilor automate etc. | ||
| + | * ''handleAction()'' - se apelează la apăsarea butonului acțiune (cel mai din dreapta). | ||
| + | * ''handleUp()'' - se apelează la deplasarea în sus a joystick-ului. | ||
| + | * ''handleLeft()'' - se apelează la deplasarea în stânga a joystick-ului. | ||
| + | * ''handleRight()'' - se apelează la deplasarea în dreapta a joystick-ului. | ||
| + | * ''handleDown()'' - se apelează la deplasarea în jos a joystick-ului. | ||
| + | |||
| + | Aceste funcții nu trebuie să dureze mult, doar cât trebuie pentru a administra evenimentul în cauză. | ||
| + | Pentru a încuraja bunele practici, există un watchdog ce nu poate fi resetat de codul Javascript, doar de alte timere interne, care să reseteze consola dacă JavaScriptul durează prea mult. | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| Line 127: | Line 160: | ||
| {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:hardwarebun1.jpg?400|}} | {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:hardwarebun1.jpg?400|}} | ||
| {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:hardwarebun2.jpg?400|}} | {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:hardwarebun2.jpg?400|}} | ||
| + | |||
| + | ==== Software ==== | ||
| + | {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:20250528_165839.jpg?400|}} | ||
| + | {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:20250528_165833.jpg?400|}} | ||
| + | {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:20250528_165851.jpg?400|}} | ||
| + | {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:20250528_165854.jpg?400|}} | ||
| + | {{:pm:prj2025:rnedelcu:ioan_alexandru.popa:20250528_165921.jpg?400|}} | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||