1

Dependencies:   mbed TextLCD

Ovo je jednostavna igra, ne previše zanimljiva, napravljena od mbed LPC1768 mikrokontrolera, 16x2 LCD-a i jedne tipke.

/media/uploads/kyzo/shema.gif

Napravljena su 3 custom charactera za animaciju lika i izgled neprijatelja, koji se na početku koda zapisuju u memoriju LCD-a.

Priključivanjem mbed-a na napajanje kod prvo poziva funkciju čitaj iz „spremanje.cpp“ koja povlači trenutni highscore iz datoteke log.txt koja se nalazi u flashu mbeda-a, sprema ga u varijablu i prikazuje na ekranu.

Nakon toga poziva se funkcija koja zapiše custom charactere iz arraya u memoriju LCD-a. Obzirom da se jedan segment LCD-a sastoji od 5x8px, custom znakove je moguće kreirati na način da se na mjesto svakog bita u bajtu koji želimo prikazati stavi 1.

Primjer kvadrat:

1 1 1 1 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1

Od toga dobijemo niz od 8 byteova ({0x1F,0x11,0x11,0x11,0x11,0x11,0x11,0x1F})koji možemo zapisati kao custom char.

U beskonačnoj petlji istovremeno se vrši animacija i manipulacija likom, crtanje i animacija prepreke, sve dok ne dođe do kolizije i kraja igre, ispisuje se rezultat i igra se vraća na početni ekran.

Za mjerenje rezultata u sekundama je zadužen timer koji resetiramo svakom novom igrom, nakon što je igra gotova vrši se provjera da li je oboren highscore, ako je zapisuje se u log.txt u flashu putem funkcije upis.

Revision:
0:316948794d55
diff -r 000000000000 -r 316948794d55 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Nov 19 13:22:48 2018 +0000
@@ -0,0 +1,252 @@
+#include "mbed.h"
+#include "TextLCD.h"
+#include "spremanje.h"
+
+
+TextLCD lcd(p19, p20, p21, p22, p23, p24); //rs,e,d0,d1,d2,d3 Definiranje lcd pinova
+
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////// Definiranje custom charactera////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+char custom_char[4][8] = {
+    {0x0C,0x0C,0x00,0x0E,0x1C,0x0C,0x1A,0x13},      // čovječuljak trk 1
+    {0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x0C,0x0E},      // čovječuljak trk 2
+    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},      // prazan char
+    {0x00,0x01,0x02,0x7C,0x81,0x7C,0x02,0x01}       // neprijatelj
+         
+};
+ 
+ 
+////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////// Definiranje varijabli, I/O////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+
+BusOut Lcd_pins(p21, p22, p23, p24);                // d4, d5, d6, d7 Definiranje lcd sabirnice za upis charactera
+Timer timer1;                                       // Timer za izračun rezultata
+DigitalOut rs_pin(p19);                             // LCD pin rs (register select.)
+DigitalOut e_pin(p20);                              // LCD pin e (enable).
+DigitalIn tipka(p14);                               // Tipka za kontrolu
+int red = 1;                                        // Varijabla za trenutačni red
+int tempRed= 0;                                     // pomoćna temp varijabla za stanje reda
+int stupac = 15;                                    // broj stupaca u igri
+int rezultat = 0;                                   // varijabla za rezultat u igri
+int highScore = 0;                                  // varijabla za highscore (čitanje/upis -> local/log.txt)
+float brzinaLika = 0.20;                            // brzina lika/neprijatelja
+bool posBit = false;                                // flag za lokaciju lika na ekranu
+bool gameOver = true;                               // flag za kraj igre
+
+
+void igra(void);                                    // funkcija igre
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// funkcija za upis custom charactera u memoriju lcd-a, u 2 koraka jer se piše 4+4 bita/
+////////////////////////////////////////////////////////////////////////////////////////
+
+void writePort(int value) {                         // slanje u 2 koraka jer koristimo 4bit na lcd
+ 
+    Lcd_pins = value >> 4;                          // shiftaj 4 bita u desno
+    wait(0.000040f); 
+    e_pin = 0;
+    wait(0.000040f);
+    e_pin = 1;
+    Lcd_pins = value;
+    wait(0.000040f);
+    e_pin = 0;
+    wait(0.000040f);
+    e_pin = 1;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////Pojava prepreka/////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void prepreka(void){
+      
+    
+      
+     tempRed = red;                                     //pospremi aktualnu vrijednost reda u temp(radi manipulacije likom)
+     red = 1;                                           //prebaci se u donji red 
+
+///////////////punjenje donjeg reda/////////////////     
+         lcd.locate(stupac+1,red);                      //lociraj se na sljedeći stupac
+         lcd.putc(2);                                   //obriši znak/ stavi prazan char
+         lcd.locate(stupac,red);                        //lociraj se na sljedeći stupac
+         lcd.putc(3);                                   //stavi char neprijatelja
+         
+          
+         
+       
+     red = tempRed;                                     //radi povratka u main vrati staru vrijednost reda
+     stupac = stupac--;                                 //umanji vrijednost stupca za 1
+     
+     if(stupac == 0 && posBit == false){                //ako je neprijatelj na poziciji i lik je gore = (udarac u lika)
+         
+             rezultat = timer1.read_ms()/1000;          // pročitaj vrijednost timera i spremi kao rez
+             lcd.cls();                                 // briši ekran
+             lcd.locate(3,0);                           // postavi kursor
+             lcd.printf("Game over!");                  // poruka
+             lcd.locate(3,1);                           // kursor novi red
+             lcd.printf("Rezultat:%i", rezultat);       // poruka
+             
+             
+             wait(2);                                   // pričekaj da se poruka stigne pročitati
+             
+             if(rezultat > highScore){                  // ako je trenutni rez veći od rekorda spremi ga kao novi rekord
+                 highScore = rezultat;
+                 upis(highScore);
+                 lcd.cls();
+                 
+                     
+                     lcd.locate(0,0);                    // postavi kursor
+                     lcd.printf("Novi highscore!!");     // ispiši novi rekord
+                     lcd.locate(6,1);                    
+                     lcd.printf("%i",highScore);
+                     wait(2);                            // pričekaj da se poruka stigne pročitati
+                                                       
+                                  }  
+                 
+             rezultat = 0;                               // poništi trenutni rezultat
+             gameOver = true;                            // aktiviraj gameover flag
+      
+         igra();                                         // skoči u funkciju igra i kreni ispočetka
+        
+         
+         }
+
+////////////////////////////////////////////////////////////////////////////////////////         
+///////////////brisanje zaostalih znakova///////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+          
+     if(stupac < 0){                                //ako je kursor došao na prvo mjesto(0)
+         
+         lcd.locate(0,1);                           //lociraj se na sljedeći stupac
+         lcd.putc(2);  
+         lcd.locate(4,0);                           //lociraj se na sljedeći stupac
+         lcd.putc(2);  
+         stupac = 15;                               //vrati ga natrag na početak
+         
+         
+         }
+ 
+ } 
+ 
+////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////Funkcija igre//////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+ 
+void igra(void){
+    
+    
+    lcd.cls();
+    wait(0.010); 
+    lcd.locate(1,0);                                // postavi kursor
+    lcd.printf("Pritisni tipku");                   // ispiši poruku
+    lcd.locate(4,1);                                
+    lcd.printf("za start"); 
+    
+    while(tipka != 1){                              // ne radi ništa dok se ne pritisne tipka za start
+        }  
+    
+    lcd.cls();
+    wait(0.010);    
+    gameOver = false;                               // resetiraj gameover flag
+    
+    timer1.reset();                                 // resetiraj timer za rezultat
+    timer1.start();                                 // ponovo ga pokreni
+    
+    while(gameOver == false){                       // vrti petlju dok god nije kraj igre
+    
+////////////////////////////////////////////////////////////////////////////////////////       
+///////////////////////////////Animacija lika///////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////      
+            lcd.locate(1,red);
+            lcd.putc(0);
+            wait(brzinaLika);
+            lcd.locate(1,red);
+            lcd.putc(1);
+            wait(brzinaLika);
+            
+////////////////////////////////////////////////////////////////////////////////////////            
+//////////////////////////////Manipulacija likom////////////////////////////////////////  
+////////////////////////////////////////////////////////////////////////////////////////          
+
+            if(tipka == 1){                         //ako je pritisnuta tipka
+                lcd.locate(1,red);                  //zadrži lokaciju na liku
+                lcd.putc(2);                        //obriši ga (upiši prazan char)
+                red = 0;                            //skoči u gornji red
+                posBit = true;                      //aktiviraj flag za poziciju
+                }
+               
+            if(tipka != 1 && posBit == true){       //ako tipka više nije aktivna, a posBit je (bio je u gornjem redu)
+                lcd.locate(1,red);                  //zadrži lokaciju na liku
+                lcd.putc(2);                        //obriši ga (upiši prazan char)
+                posBit = false;                     //resetiraj posbit
+                red = 1;                            //vrati lika u donji red
+                }   
+ 
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////Poziv funkcije za pojavu prepreka///////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////        
+            
+            prepreka(); 
+            
+            
+            
+        
+        }
+ 
+ } 
+
+////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////Main funkcija//////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+ 
+int main() {
+    
+    highScore = citaj();                            // pročitaj aktualni rekord iz log.txt i spremi u varijablu
+    lcd.cls();
+    lcd.locate(2,0);                                // postavi kursor
+    lcd.printf("Ucitavanje..");
+    wait(2);
+    lcd.cls();
+    lcd.locate(2,0);                                
+    lcd.printf("Highscore:%d", highScore);          // ispiši highscore
+    wait(2);
+    
+
+////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////Upis custom charactera u mem lcd-a/////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+
+    for (int j=0; j<8; j++) {
+ 
+        rs_pin = 0;                                 // slanje komande
+ 
+       
+        writePort(0x40+8*j);                        // 0x40 je početna adresa, za svaki char je potrebno 8 mem lokacija
+ 
+ 
+
+        rs_pin = 1;                                 // slanje charova
+ 
+ 
+        for (int i=0; i<8; i++) {
+            writePort(custom_char[j][i]);
+        }
+    }
+ 
+ 
+ 
+    lcd.cls();
+    wait(0.010);
+ 
+
+    lcd.locate(0,1);
+ 
+        igra();                                     // skoči u funkciju igre
+
+
+
+}
\ No newline at end of file