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.

main.cpp

Committer:
kyzo
Date:
2018-11-19
Revision:
0:316948794d55

File content as of revision 0:316948794d55:

#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



}