Table of Contents

Alexandru DINU (66860) - DX-Ball

Autorul poate fi contactat la adresa: alex.dinu07@gmail.com

Introducere

<imgcaption exemplu_gameplay|Original DX-Ball gameplay></imgcaption>

Proiectul constă în implementarea clasicului joc de tip arcade DX-Ball (1996), în care user-ul controlează un paddle și o minge, cu scopul de a elimina blocurile colorate și de a avansa în nivele. Vor exista multiple tipuri de blocuri, acestea respectând un anumit layout în funcție de nivel și fiecare incrementând scorul în mod diferit:

Pentru a păstra cât mai mult din gameplay-ul original și pentru a obține o experiență vizuală mai bogată, voi folosi un modul LCD color de 2.2” (controller HX8340-B). De asemenea, controlul plăcuței (paddle-ului) se va face cu ajutorul accelerometrului.

Am ales DX-Ball pentru că a fost printre primele jocuri pe care le-am jucat și am considerat că implementarea acestuia în cadrul proiectului mă va ajuta să aprofundez cunoștințele din acest domeniu într-un mod plăcut.

Proiectul este, în principal, util pentru a invăța cum să realizez interfațarea cu un modul LCD și un accelerometru atât haradware, cat și prin folosirea unor API-uri specifice.

Descriere generală

<imgcaption schema_bloc_proiect|Schema bloc a proiectului></imgcaption>

Controlul efectiv al paddle-ului va fi realizat prin interpretarea datelor de la accelerometru: rotația acestuia în jurul unei axe va fi mapată (software) pe mișcarea paddle-ului. Începerea jocului (prin lansarea mingii de pe paddle) va fi marcată prin apasarea unui pushbutton de pe placa de bază. Desenarea pe LCD[1] va fi implementată adaptând biblioteca acestuia pentru utilizarea cu ATmega324. În biblioteca sunt definite funcții de generare de primitive (linii, cercuri, dreptunghiuri), precum și funcții care permit scrierea de text.

În joc vor exista blocuri de diferite tipuri, a căror distrugere va incrementa scorul jucătorului cu o anumită valoare și, eventual, va genera un power-up (pozitiv sau negativ) pe care jucătorul trebuie să-l preia sau să-l ignore. Scopul este de a avansa in nivele și de a nu lăsa mingea să cada în afara limitei inferioare a ecranului (caz în care numărul de vieți scade). Jocul se termină fie când numărul de vieți ajunge la 0, fie când se termină ultimul nivel. Power-up-urile pozitive sunt: extra life, shooting paddle, multiply exploding, iar cele negative: kill paddle, mini ball, fast ball.

[1]Alimentarea modulului LCD se face la 3.3V utilizând un regulator de tensiune LE33 (plăcuța în sine va funcționa la 3.3V).

Hardware Design

Lista de piese

Nume Detalii Cantitate
Placă de bază PM 2017 1
Modul LCD ITDB02-2.2SP (controller HX8340-B) 1
Regulator tensiune 5V-3.3V LE33 1
Condensator electrolitic Capacitate 10 μF 1
Accelerometru MPU-6050 1
Pushbutton TS-06E (TS-3) 1

Schema electrică

Software Design

Mediu de dezvoltare

WinAVR + Programmer's Notepad

Biblioteci / surse 3rd-party

Algoritmi, tipuri și structuri de date

Surse implementate

// lcd.h / lcd.c
void init_lcd(uint8_t orientation); 
void fill_screen(uint8_t r, uint8_t g, uint8_t b);
void clear_screen();
void set_pixel(uint8_t r, uint8_t g, uint8_t b);
void draw_pixel(int x, int y);
void set_foreground_color(uint8_t r, uint8_t g, uint8_t b);
void set_background_color(uint8_t r, uint8_t g, uint8_t b);
// lcd.h / lcd.c
void set_font(uint8_t *font); 
void print_char(uint8_t c, int x, int y);
void print_string(char *st, int x, int y, int deg);
 
void draw_straight_line(int x, int y, int l, int type);
void draw_empty_rectangle(int x1, int y1, int x2, int y2);
void draw_filled_rectangle(int x1, int y1, int x2, int y2);
void draw_empty_circle(int x, int y, int radius);
void draw_filled_circle(int x, int y, int radius);
// mpu6050.h / mpu6050.c
// initialise the accelerometer and gyroscope
void mpu6050_init();
//get raw data converted to g and deg/sec values
void mpu6050_getConvData(double* axg, double* ayg, double* azg, double* gxds, double* gyds, double* gzds);

Rezultate obţinute

În implementarea inițială am vrut să interfațez cu QTouch slider-ul, dar după integrarea bibliotecii și câteva ore de debug am observat că datele primite de la acesta sunt lipsite de sens. Astfel, pentru a nu pierde prea mult timp, am decis să înlocuiesc QTouch slider-ul cu un accelerometru (MPU-6050), pentru îndeplinirea aceluiași scop: mișcarea paddle-ului pe ecran. Am reușit foarte repede să interfațez cu accelerometrul și să interpretez datele de la acesta pentru a mișca paddle-ul. Mai mult, o rotație cu un unghi mai mare rezultă în accelerarea mișcării paddle-ului pe ecran.

Din acest punct, am început să schițez logica jocului în sine.

Concluzii

Download

Jurnal

<imgcaption hello_world|Hello, World!></imgcaption>

<imgcaption setup_actual|Setup actual: (accelerometru - μC - LCD)></imgcaption>

Bibliografie/Resurse