Sisic Nedim i Yahya Aly
Dependencies: SPI_TFT_ILI9341 TFT_fonts mbed
Diff: main.cpp
- Revision:
- 0:78147151cc2c
- Child:
- 1:257db033a098
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Jun 30 22:34:56 2018 +0000 @@ -0,0 +1,399 @@ + +#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); + } +} \ No newline at end of file