Sisic Nedim i Yahya Aly
Dependencies: SPI_TFT_ILI9341 TFT_fonts mbed
main.cpp
- Committer:
- 2018US_NedimSisic
- Date:
- 2018-07-01
- Revision:
- 1:257db033a098
- Parent:
- 0:78147151cc2c
File content as of revision 1:257db033a098:
#include "mbed.h" #include "stdio.h" #include "SPI_TFT_ILI9341.h" #include "stdlib.h" #include "time.h" #include "string" //#include "Arial12x12.h" #include "Arial24x23.h" //#include "Arial28x28.h" //#include "Neu42x35.h" //#include "font_big.h" //#include "SDFileSystem.h" #define dp23 P0_0 //SPI_TFT_ILI9341 TFT(PTD2,PTD3,PTD1,PTD0,PTA20,PTA13,"TFT"); // mosi, miso, sclk, cs, reset, dc SPI_TFT_ILI9341 TFT(dp2,dp1,dp6,dp24,dp23,dp25,"TFT"); #define xKraj 319 #define yKraj 239 #define xPtica 100 #define vrhZelenog 195 #define dnoZelenog 206 #define duzinaZelenog 80 #define pomakPticeY 1 #define ZelenaNaslov 47011 #define TamnoZelena 28133 #define SvijetloZelena 38698 #define NeboPlava 19993 #define Zemlja 54961 #define Zuto 63364 //InterruptIn t(A2); InterruptIn t(dp9); int pticaY, prosliPticaY; float brzinaPtice(0), grav(1); float frame(0.033333); int stuboviXevi[3]; // = {320, 320, 320}; int stuboviY[3]; int prviZelPocetak, drugiZelPocetak; int dijelic = 3; // za koliko se pomjere stubovi i zeleni dijelovi u jednom frameu int maxBrzina (20), skokBrzina(-7); int stanje(0); int skor, bestSkor; bool kolizija(false); bool pocetak(true); // true do prvog pojavljivanja treceg stuba void ns(); //++++++++++++++ Ptica void crtajPticu() { // crtaj pticu // brisanje if (prosliPticaY == pticaY) // Nema potrebe za brisanjem return; if (prosliPticaY < pticaY) { // pomjerila se dolje // generalno: da li je brze ili sporije if (){return;} else()... TFT.fillrect(xPtica - 9, prosliPticaY - 6, xPtica + 7, pticaY - 7, NeboPlava); // od proslog pocetka do trenutnog } else { // pomjerila se gore TFT.fillrect(xPtica - 9, pticaY + 6, xPtica + 7, prosliPticaY + 5, NeboPlava); // od trenutnog kraja do proslog } // crtanje // za crtanje ptice promjenljiva je pticaY TFT.fillrect(xPtica-6,pticaY-5,xPtica,pticaY+4,63364); // zuto TFT.pixel(xPtica-6,pticaY-5,19993); TFT.fillrect(xPtica,pticaY-5,xPtica+4,pticaY-1,White); // bijelo TFT.pixel(xPtica+4,pticaY-5,19993); TFT.fillrect(xPtica-8,pticaY-2,xPtica-4,pticaY+1,White); // bijelo // horizontalne linije TFT.line(xPtica+1,pticaY,xPtica+6,pticaY,18856); TFT.line(xPtica+1,pticaY+2,xPtica+6,pticaY+2,18856); TFT.line(xPtica+1,pticaY+4,xPtica+5,pticaY+4,18856); TFT.line(xPtica+1,pticaY+1,xPtica+6,pticaY+1,62216); TFT.line(xPtica+1,pticaY+3,xPtica+5,pticaY+3,62216); TFT.line(xPtica-3,pticaY-6,xPtica+2,pticaY-6,18856); TFT.line(xPtica-8,pticaY-3,xPtica-5,pticaY-3,18856); TFT.line(xPtica-6,pticaY+4,xPtica-5,pticaY+4,18856); TFT.line(xPtica-5,pticaY-5,xPtica-4,pticaY-5,18856); // vertikalne linje TFT.line(xPtica+5,pticaY-3,xPtica+5,pticaY-1,18856); TFT.line(xPtica+3,pticaY-3,xPtica+3,pticaY-2,18856); TFT.line(xPtica-1,pticaY-4,xPtica-1,pticaY-2,18856); TFT.line(xPtica-3,pticaY-1,xPtica-3,pticaY,18856); TFT.line(xPtica-9,pticaY-2,xPtica-9,pticaY,18856); // pixeli TFT.pixel(xPtica,pticaY-1,18856); TFT.pixel(xPtica,pticaY+1,18856); TFT.pixel(xPtica,pticaY+3,18856); TFT.pixel(xPtica,pticaY-5,18856); TFT.pixel(xPtica-4,pticaY+1,18856); TFT.pixel(xPtica+7,pticaY+1,18856); TFT.pixel(xPtica-7,pticaY+3,18856); TFT.pixel(xPtica+6,pticaY+3,18856); TFT.pixel(xPtica-1,pticaY+2,18856); TFT.pixel(xPtica-4,pticaY-2,18856); TFT.pixel(xPtica-6,pticaY-4,18856); TFT.pixel(xPtica+3,pticaY-5,18856); TFT.pixel(xPtica+4,pticaY-4,18856); TFT.pixel(xPtica,pticaY+2,62216); } /* void crtajPticu() { if (prosliPticaY == pticaY) // Nema potrebe za brisanjem return; if (prosliPticaY < pticaY) { // pomjerila se dolje // generalno: da li je brze ili sporije if (){return;} else()... TFT.fillrect(xPtica - 9, prosliPticaY - 6, xPtica + 7, pticaY - 7, NeboPlava); // od proslog pocetka do trenutnog } else { // pomjerila se gore TFT.fillrect(xPtica - 9, pticaY + 6, xPtica + 7, prosliPticaY + 5, NeboPlava); // od trenutnog kraja do proslog } // crtanje TFT.fillrect(xPtica - 9, pticaY - 6, xPtica + 7, pticaY + 5, Zuto); TFT.fillrect(xPtica + 3, pticaY - 3, xPtica + 4, pticaY, 18856); // alt brisanje: if (prosli != trenutni) TFT.fillrect(xPtica - 9, prosliPticaY - 6, xPtica + 7, prosliPticaY + 5, NeboPlava); } */ void skok() { // flap brzinaPtice = skokBrzina; } //++++++++++++ Ptica^^^, update je kod tla //********* TLO void crtajZeleniDjelic(int pocetak) { TFT.fillrect(pocetak, vrhZelenog, pocetak + dijelic - 1, dnoZelenog, SvijetloZelena); } void brisiZeleniDjelic(int izaKraja) { TFT.fillrect(izaKraja, vrhZelenog, izaKraja + dijelic + 1, dnoZelenog, TamnoZelena); } void crtajCijeliZeleni(int pocetak) { crtajZeleniDjelic(pocetak); brisiZeleniDjelic(pocetak + duzinaZelenog); // TFT.fillrect(pocetak, vrhZelenog, pocetak + duzinaZel , dnoZelene, SvijetloZelena); } void crtajZeleniDijelovi(int pocetak) { brisiZeleniDjelic(duzinaZelenog - xKraj + pocetak - 1); // 0 + duzZ - ((xKraj - poc) + 1) crtajZeleniDjelic(pocetak); // TFT.fillrect(0, vrhZelenog, duzinaZel - xKraj + pocetak , dnoZelenog, SvijetloZelena); // TFT.fillrect(pocetak , vrhZelenog, xKraj, dnoZelenog, SvijetloZelena); } void crtajZelene() { // (int prviZelPocetak, int drugiZelPocetak) if (prviZelPocetak > xKraj - duzinaZelenog + 1) { // prvi u dijelovima crtajZeleniDijelovi(prviZelPocetak); crtajCijeliZeleni(drugiZelPocetak); } else if (drugiZelPocetak > xKraj - duzinaZelenog + 1) { // drugi u dijelovima crtajCijeliZeleni(prviZelPocetak); crtajZeleniDijelovi(drugiZelPocetak); } else { // oba su cijeli crtajCijeliZeleni(prviZelPocetak); crtajCijeliZeleni(drugiZelPocetak); } } void updatePticaZel() { // update y koordinate ptice, i pratecih varijabli brzinaPtice += grav; if (brzinaPtice > maxBrzina) brzinaPtice = maxBrzina; prosliPticaY = pticaY; pticaY += brzinaPtice * pomakPticeY; if (pticaY + 3 >= vrhZelenog) { kolizija = true; } else if (pticaY < 5) { // pri vrhu ekrana pticaY = 6; } // Update x koordinata zelenih prviZelPocetak -= dijelic; drugiZelPocetak -= dijelic; if (prviZelPocetak < 0) { prviZelPocetak = xKraj + 1 - dijelic; } else if (drugiZelPocetak < 0) { drugiZelPocetak = xKraj + 1 - dijelic; } } //************** Tlo^^^ //---------------- STUBOVI void crtajStubove() {// promjena for (int i = 0; i < 3; i++) { // brisanje if (stuboviXevi[i] + 36 + dijelic < 320) { TFT.fillrect(stuboviXevi[i] + 36, 0, stuboviXevi[i] + 37 + dijelic, stuboviY[i] - 85, NeboPlava); TFT.fillrect(stuboviXevi[i] + 36, stuboviY[i], stuboviXevi[i] + 37 + dijelic, 194, NeboPlava); } // crtanje if (stuboviXevi[i]>= 0) { TFT.fillrect(stuboviXevi[i], 0, stuboviXevi[i] +dijelic, stuboviY[i] - 85, 26571); TFT.fillrect(stuboviXevi[i], stuboviY[i], stuboviXevi[i] + dijelic, 194, 26571); } } } void updateStubovi() { int n(0); // broj aktivnih stubova if (pocetak && stuboviXevi[0] > 200) n = 1; else if (pocetak && stuboviXevi[0] > 81) n = 2; else { n = 3; pocetak = false; } for(int i(0); i < n; i++) { if (stuboviXevi[i] - dijelic >= -36) // mozda povecati sa -36 na vise, ili samo vece bez jednako { stuboviXevi[i] -= dijelic; // prva greska: bez (-) if (stuboviXevi[i] <= 100 && stuboviXevi[i] + dijelic > 100) { // dodano manjeJEDNAKO skor++; ns(); } if (stuboviXevi[i] < 107 && stuboviXevi[i] + 35 > 91 && // stuboviXevi[i] < 107 && stuboviXevi[i] > 56 (pticaY + 3 >= stuboviY[i] || pticaY - 6 <= stuboviY[i] - 86)) { kolizija = true; return; } } else { stuboviXevi[i] = 320; stuboviY[i] = rand()%35 + 115; // opseg mozemo prosiriti ako treba } } } //---------------- Stubovi^ void nultoStanje() { // stanje 0: intro ekran TFT.background(Black); // set background to black TFT.foreground(ZelenaNaslov); // set chars to light green TFT.cls(); TFT.set_font((unsigned char*) Arial24x23); TFT.locate(75, 98); printf("Flappy bird"); wait(2); } void prvoStanje() { // stanje 1, ptica se ne pomjera // pocetne vrijednosti pticaY = 120; prviZelPocetak = duzinaZelenog * 2; drugiZelPocetak = duzinaZelenog * 4; crtajPticu(); while(stanje == 1) { // dok je stanje 1 (mijenja se samo klikom) crtajZelene(); updatePticaZel(); // mijenja i pticu, ali se ne prikazuje wait(frame); } } void drugoStanje() { // Stanje 2, let ptice bez stubova pticaY = 120; kolizija = false; brzinaPtice = skokBrzina; // samo promijenili brzinu da bude skok for (int i = 0; i < 60; i++) { // 60 = 2s/frame, ne mozemo poravnati sa stubovima? crtajPticu(); crtajZelene(); updatePticaZel(); if (i < 30) { TFT.fillrect(70, dnoZelenog + 1, 120, dnoZelenog + 2, 21508); TFT.fillrect(70, dnoZelenog + 3, 120, dnoZelenog + 4, 52552); TFT.fillrect(70, dnoZelenog + 5, 120, yKraj, Zemlja); } if (kolizija) return; wait(frame); } } void cetvrtoStanje() { // meni // promjena //TFT.set_font((unsigned char*) Arial24x23); if(skor > bestSkor) bestSkor = skor; TFT.fillrect(55, 80, 264, 191, 54961); TFT.locate(65, 100); printf("GAME OVER"); TFT.locate(75, 130); printf("Score: %d", skor); TFT.locate(75, 160); printf("Best: %d", bestSkor); } void ns() { // napisi skor // promjena (nova funkcija) int pozx(120); if(skor < 10) pozx = 155; else if(skor < 100) pozx = 148; else if(skor < 1000) pozx = 140; //TFT.fillrect(140,215,180,230,18856); // mozda zatreba TFT.locate(pozx, 215); printf("%d", skor); } void klik() { if (stanje == 2 || stanje == 3) { // ako je stanje 2 ili 3; stanje & 2 skok(); } else if (stanje == 1) { // ako je stanje 1; stanje & 1 stanje++; } else if (stanje == 4) { // stanje je 4; stanje & 4 stanje = 1; } } int main() { //Inicijalizacija; TFT.claim(stdout); TFT.set_orientation(1); // enable = 0 ?? srand(time(NULL)); skor = 0; bestSkor = 0; stanje = 0; nultoStanje(); // intro ekran t.mode(PullUp); t.rise(&klik); // Stanja 1 do 4 while(1) { // Crtanje pozadine TFT.fillrect(0, 0, xKraj, vrhZelenog - 1, NeboPlava); TFT.fillrect(0, vrhZelenog + 3, xKraj, dnoZelenog, TamnoZelena); TFT.fillrect(0, dnoZelenog + 1, xKraj, dnoZelenog + 2, 21508); TFT.fillrect(0, dnoZelenog + 3, xKraj, dnoZelenog + 4, 52552); // TODO: dodati linije, to su one dolje, modifikovati TFT.fillrect(0, dnoZelenog + 5, xKraj, yKraj, Zemlja); TFT.background(54961); TFT.foreground(Black); stanje = 1; prvoStanje(); // nakon klika stanje = 2; drugoStanje(); // traje 2s ili do sudara sa tlom stanje = 3; // igranje sa preprekama for (int i = 0; i < 3; i++) { stuboviXevi[i] = 320; stuboviY[i] = rand()%70 + 100; } frame = 0.015; while (!kolizija) { crtajPticu(); crtajStubove(); crtajZelene(); updatePticaZel(); updateStubovi(); wait(0.025); } // doslo do kolizije wait(1); stanje = 4; cetvrtoStanje(); wait(4); // dodane dvije linije pocetak = true; skor = 0; } }