Robert-Mihai BOŢÂRLEANU (25370) - Space Invaders pe LCD

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Proiectul constă în realizarea jocului Space Invaders. Afișajul se va face pe un LCD, iar utilizatorul va putea interfața cu jocul prin intermediul a 3 butoane: 2 direcționale și unul folosit pentru a trage slider-ului de qtouch de pe placa și a unui buton folosit pentru a trage. Adversarii în cadrul jocului vor consta în rânduri de navete inamice, care vor putea trage în nava jucătorului. Pentru a păstra atmosfera originală a jocului, un Buzzer va reproduce soundtrack-ul.

Scopul este implementarea unui joc amuzant pentru utilizator, el putând să încerce să își bată scorul cel mai mare obținut anterior.

Ideea a pornit de la dorința de a emula sistemele de jocuri din anii 70, iar Space Invaders este un exemplu iconic din acea eră.

Notă: Am renunțat la folosirea a două butoane pentru controlul direcției navei jucătorului, alegând în schimb să ofer o interfață mai modernă prin intermediul slider-ului de qtouch. Consider că acest lucru este un upgrade și oferă o experiență mai interesantă.

Descriere generală

Schema bloc

Descriere

La pornirea jocului, se va afișa un mesaj pe ecran iar utilizatorul va putea iniția runda apăsând pe butonul de tragere.

În timpul unei runde de joc, utilizatorul va putea să își deplaseze nava la stânga/dreapta folosind două butoane slider-ul de qtouch, iar un alt buton îl va folosi pentru a trage în navele inamice. Dacă jucătorul reușește să învingă toate navele, un nou set vor popula automat harta, el putând să continue jocul și să primească un scor mai bun. La fiecare repopulare a hărții, viteza și rata de tragere a navelor inamice va crește, jocul devenind din ce în ce mai dificil.

Jocul se termină atunci când utilizatorul pierde dacă este lovit de către navele inamice. Se va afișa scorul obținut de utilizator și mesajul de început de joc, utilizatorul putând face o nouă încercare apăsând pe butonul de tragere.

Pe parcursul derulării jocului, un Buzzer va reda continuu soundtrack-ul Space Invaders va emite un sunet atunci când jucătorul trage.

Notă: negăsind cântecul temă pentru Space Invaders, am fost forțat să abandonez ideea de a avea melodia rulând pe fundal. în varianta finală, buzzer-ul va produce feedback auditiv în momentul în care un jucător trage.

Hardware Design

Lista de piese

Nr. Crt. Piesă Cantitate Preț Magazin Observații
1 ATMEGA324PA-PU 1 21.74 Farnell Datasheet
2 USB-B 1 2 Farnell N/A
3 16MHZ QMIM016 1 1.17 Farnell N/A
4 ZENER 2 0.5 Farnell N/A
5 LED EL333 2 1.09 Farnell N/A
6 K1X10 WSL040 1 0.5 Comet N/A
7 K2X10 1 1.17 Farnell N/A
8 PUSHBUTTON 2 0.66 Farnell N/A
9 100R 3 0.23 Farnell N/A
10 470R 3 0.22 Farnell N/A
11 1K5 1 0.24 Farnell N/A
12 10K 1 0.24 Farnell N/A
13 100nF 3 0.41 Farnell N/A
14 15pF KEPF015 2 0.44 Farnell N/A
15 Soclu DIP40 dil40emf 1 1.15 Farnell N/A
16 Jumper 1 0.76 Farnell N/A
17 TD-T1464 1 29.95 OptimusDigital Datasheet
18 Fire Colorate Mamă-Tată 2×10 7.45 OptimusDigital N/A
19 Buton 6x6x6 31 1.99 OptimusDigital N/A
20 Modul cu Buzzer activ 1 6.95 OptimusDigital Schemă electrică
21 Placă de test 1 4.2 Farnell N/A
22 Regulator tensiune 1 2.18 Farnell N/A
23 Condensator electrolitic 16V 1 0.2 Franell N/A
24 27nF 1206 3 0.57 Farnell N/A
25 1K 1206 3 0.57 Farnell N/A

Schema electrică

Varianta originală

Varianta cu qtouch

Software Design

1. Mediu de dezvoltare

2. Librării și surse 3rd-party

3. Implementare software

Implementarea software se bazează pe librăria pentru LCD-ul grafic de 128x128px color și pe cea pentru qtouch slider.

Pe lângă acestea, în fișierele “space_invaders.h/c” se găsesc funcții folosite pentru a randa pe ecran jocul Space Invaders, logica principală a jocului fiind implementată în fișierul “main.c”.

Ca structură de date auxiliară, am folosit implementarea proprie de listă simplu înlănțuită generică - ea fiind folosită pentru a menține gloanțele trase de navele extraterestre.

Jucătorul se poate mișca stânga/dreapta folosind qtouch slider-ul și poate trage folosind butonul de pe placa de bază “BTN”.

Din cauza faptului ca librăria de qtouch folosită necesită dezactivarea pull-upurilor pe durata măsurării, ca work-around am ales să dezactivez (folosind bitul PUD din MCU Control Register), să realizez măsurătoarea efectivă și să reactivez rezistențele de pull-up (specific pe cea a butonului) după măsurare. Comportamentul astfel obținut este unul corect, ambele metode de input funcționând fără probleme.

Din cauza faptului ca randarea de obiecte pe LCD (în special cele de dimensiune mare) este ineficientă, am ales să realizez anumite optimizări pentru a obține o performanță mai bună:

  • funcțiile de randare pentru glonț/jucător/inamic primesc un parametru suplimentar - clear - care poate fi folosit pentru a șterge de pe ecran obiectul respectiv (defapt, îl redesenează cu background color);
  • asteroizii sunt randați o singură dată, la începutul unei sesiuni și componentele lor individuale sunt “șterse” folosind metoda descrisă la primul subpunct.

Interfața oferită pentru randarea jocului constă în următoarele funcții:

    void draw_player(const player_t, char);
    void draw_alien(const alien_t, char);
    void draw_bullet(const bullet_t, char);
    void shoot_bullet(bullet_t *, const player_t);
    void draw_asteroid(const asteroid_t, char);
    void setup_asteroid_parts(asteroid_t *);
    void shoot_bullet_alien(bullet_t *, const alien_t);
    

Iar structurile de date ce încapsulează actorii jocului sunt bullet_t, alien_t, player_t, asteroid_t.

Așa cum am precizat în descriere, jocul se derulează un număr infinit de runde ce au o dificultate care crește continuu. Inamicii vor trage din ce în ce mai des, iar asteroizii vor fi, natural, distruși pe măsură ce rundele progresează.

Scorul jucătorului și highscore-ul pentru instanța curentă vor fi afișate în partea de sus a ecranului.

Mai multe detalii cu privire la implementare se pot regăsi în fișierul README din arhiva ce conține codul sursă, cât și în comentarii.

Rezultate Obţinute

Cu excepția faptului că nu am putut reda melodia de fundal a jocului Space Invaders, rezultatele obținute au depășit așteptările.

Realizarea controlului direcției prin intermediul slider-ului de qtouch, cât și implementarea eficientă a jocului, care funcționează fără întârzieri cauzate de randare sau de calcule, precum și prin includerea de asteroizi destructibili pe ecran mă fac să consider implementarea finală superioară, în multe aspecte, viziunii inițiale.

Un video demonstrativ poate fi văzut aici: Link YouTube

Concluzii

Proiectul a fost unul interesant, în care am învățat lucruri noi despre realizarea de programe folosind microcontroloare, în condiții mult mai limitate decât programarea realizată până atunci.

Jocul este complet funcțional, randarea pe ecran este eficientă, controlul este intuitiv și ușor de folosit, cu excepția unor mici probleme de sensitivitate ale slider-ului de qtouch.

Download

Bibliografie/Resurse

pm/prj2016/amusat/space-invaders-game.txt · Last modified: 2021/04/14 17:07 (external edit)
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