1
Ovo je jednostavna igra, ne previše zanimljiva, napravljena od mbed LPC1768 mikrokontrolera, 16x2 LCD-a i jedne tipke.
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.
Diff: main.cpp
- Revision:
- 0:316948794d55
--- /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