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.
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 }