Denis-George MARCU (67180) - Car race
Introducere
Proiectul pe care l-am ales consta in implementarea unui joc de pe un brick game, si anume un joc cu masini (car race), pe un LCD. Scena jocului este alcatuita din mai multe benzi de mers, pe care circula masini in acelasi sens cu masina playerului. Scopul jocului este de a depasi aceste masini. Cu fiecare masina depasita, playerul va acumula puncte, iar in urma unei coliziuni, acesta va pierde o viata din cele 3 disponibile. Pentru sunetele specifice jocului vom folosi un buzzer.
Descriere generală
Schema bloc
Jocul va avea doua nivele de dificultate care pot fi alese la inceput de catre utilizator:
nivelul mai usor: circuitul este format din doua benzi de mers, iar masinile inamice vin la distante mai mari
nivelul mai greu: circuitul este format din trei benzi, iar masinile vin una in urma celeilalte, pastrand totusi un culoar pentru masina playerului
Masina playerului este controlata cu ajutorul butoanelor (stanga/dreapta).
De asemenea, la fiecare apasare de buton va exista un sunet specific.
Distantele dintre masini si viteza acestora se vor micsora, respectiv mari, o data cu avansarea in joc. Exista si un buton de accelerare,
care mareste viteza de deplasare a playerului atunci cand este apasat si readuce masina playerului la viteza normala atunci cand este lasat liber.
La finalul jocului, va exista posibilitatea unui replay, folosind un buton.
Hardware Design
Lista piese
Placa de baza
Componente de baza
Modul LCD cu Controller PCD8544 (compatibil cu Nokia 5110)
2 butoane (pentru controlul masinii)
1 buton pentru accelerarea masinii sau reset joc
2 seturi de fire (mama-mama)
1 set de fire (tata-tata)
Placa de test
Buzzer pasiv 5V
Condensator 10uF
Schema electrica
Software Design
Mediu de dezvoltare
Biblioteci
avr/io.h
avr/interrupt.h
util/delay.h
avr/pgmspace.h
stdio.h
-
Descriere implementare
Initial vom aveam un cadru de introducere cu text (materie, nume, grupa) si o bara de loading. Pentru a desena acestea am folosit functiile din biblioteca lcd-ului, avem functie pentru scrierea unui string si functie pentru setarea unui pixel. Bara de loading am realizat-o colorand treptat pixelii a 3 linii de la baza ecranului (o bara de loading mai ingrosata), avand pauze intre iteratii cu ajutorul unui delay.
Al doilea cadru este o animatie pentru joc: se vor deplasa de sus spre centrul ecranului o masina, urmata de cuvintele “RACE” si “CAR”. Pentru a desena o masina mi-am definit o matrice de 0 si 1, in care realizez silueta acesteia folosind 1. Astfel, am realizat o functie care seteaza pixelul atunci cand in matricea respectiva este 1. Asemenea si pentru literele din cuvintele “CAR” si “RACE”, avem definite matrici pentru a afisa litere mari si ingrosate. Dupa ce s-a terminat animatia, se va astepta pentru butonul ok.
Urmatorul cadru este cel de selectare a nivelului dorit. Avem nivelele 1 sau 2, iar selectarea se face folosind butoanele stanga/dreapta. Pe ecran, nivelul selectat apare intr-un box. Acesta l-am desenat folosind functia de setarea a pixelilor si o matrice ce descrie conturul unui box. Apasam butonul ok pentru a continua jocul.
Nivelul 1: Vom avea un cadru de introducere in nivel cu textul “Livel 1” si animatia pentru bara de loading, apoi va incepe jocul efectiv. Scena jocului este formata din doua benzi. Masina playerului este mereu la baza ecranului, initial pe banda din stanga. Pentru a muta masina de pe o banda, vom folosi butoanele stanga/dreapta, iar la o mutare efectiva, buzzerul va reda un sunet semnaland schimbarea de banda. Masinile inamice vor fi pozitionate random pe una din benzi, avand distanta dintre ele de o masina, pentru a avea loc masina player-ului intre ele. Pentru simularea miscarii, practic deplasam scena spre masina player-ului si adaugam alte masini in partea de sus atunci cand distanta ne permite acest lucru.
Nivelul 2: Avem un cadru de introducere in nivel cu textul “Livel 2” si animatia pentru bara de loading, apoi va incepe jocul. Scena este formata din trei benzi. Masina playerului se afla la baza ecranului, initial pe banda din centru. Ea se poate misca doar pe orizontala. Pentru a muta masina de pe o banda, vom folosi butoanele stanga/dreapta, iar o deplasare va fi semnalata cu ajutorului buzzer-ului. Masinile inamice vor fi pozitionate random pe una din benzi, avand grija ca adaugarea unei noi masini sa nu formeze o diagonala, blocand culoarul masinii player. Masinile inamice sunt adaugate una dupa alta, neexistand distanta prea mare intre ele, de aceea la adaugare trebuie avut grija ca masina player sa aiba mereu culoar. Deplasarea masinii player inainte se face prin deplasarea scenei catre acesta: afisam scena, avem un delay, apoi stergem scena si o deplasam cu doi pixeli, urmand sa repetam procedeul.
Player-ul are 3 vieti. La pierderea unei vieti, avem un nou cadru prin care se informeaza player-ul de numarul de vieti ramase si se reincepe jocul. La pierderea celor 3 vieti, jocul se termina. Se va afisa mesajul “GAME OVER” si scorul adunat de player. Va exista acum posibilitatea unui reset, ce are ca efect revenirea la cadrul de selectare a nivelului.
Rezultate Obţinute
Demo proiect watch
Cadrele de inceput ale jocului
Selectarea nivelului
Nivelele 1 si 2
Concluzii
Proiectul a fost foarte interesant, as putea spune chiar o provocare, din care am invatat multe lucruri, cum ar fi lipirea componentelor, folosirea unui datasheet, programarea unui microcontroler si utilizarea unei biblioteci lcd pentru afisarea unor imagini/figuri pe acesta.
Download
Jurnal - Etapele realizarii proiectului
Saptamana 8: Am ales tema proiectului
Saptamana 9: Descrierea in mare a proiectului si schema bloc a acestuia
Saptamana 10: Cumpararea pieselor pentru placuta de baza si lipirea acestora
Saptamana 11: Schema electrica a proiectului
Saptamana 12: Achizitionarea pieselor necesare proiectului si realizarea hardware-ului
Saptamana 13-14: Implementarea software-ul
Bibliografie/Resurse
Resurse Hardware
Resurse Software
Documentația în format PDF