Nedim Sisic / Mbed 2 deprecated FlappyBird

Dependencies:   SPI_TFT_ILI9341 TFT_fonts mbed

Files at this revision

API Documentation at this revision

Comitter:
2018US_NedimSisic
Date:
Sat Jun 30 22:34:56 2018 +0000
Child:
1:257db033a098
Commit message:
Publishovanje projekta Flappy Bird, Yahya Aly i Nedim Sisic

Changed in this revision

SPI_TFT_ILI9341.lib Show annotated file Show diff for this revision Revisions of this file
TFT_fonts.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SPI_TFT_ILI9341.lib	Sat Jun 30 22:34:56 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/dreschpe/code/SPI_TFT_ILI9341/#b2b3e5430f81
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TFT_fonts.lib	Sat Jun 30 22:34:56 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/dreschpe/code/TFT_fonts/#76774250fcec
--- /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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Jun 30 22:34:56 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/5aab5a7997ee
\ No newline at end of file