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.

Committer:
kyzo
Date:
Mon Nov 19 13:22:48 2018 +0000
Revision:
0:316948794d55
Prva verzija

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kyzo 0:316948794d55 1 #include "mbed.h"
kyzo 0:316948794d55 2 #include "TextLCD.h"
kyzo 0:316948794d55 3 #include "spremanje.h"
kyzo 0:316948794d55 4
kyzo 0:316948794d55 5
kyzo 0:316948794d55 6 TextLCD lcd(p19, p20, p21, p22, p23, p24); //rs,e,d0,d1,d2,d3 Definiranje lcd pinova
kyzo 0:316948794d55 7
kyzo 0:316948794d55 8 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 9 ////////////////////////// Definiranje custom charactera////////////////////////////////
kyzo 0:316948794d55 10 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 11 char custom_char[4][8] = {
kyzo 0:316948794d55 12 {0x0C,0x0C,0x00,0x0E,0x1C,0x0C,0x1A,0x13}, // čovječuljak trk 1
kyzo 0:316948794d55 13 {0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x0C,0x0E}, // čovječuljak trk 2
kyzo 0:316948794d55 14 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // prazan char
kyzo 0:316948794d55 15 {0x00,0x01,0x02,0x7C,0x81,0x7C,0x02,0x01} // neprijatelj
kyzo 0:316948794d55 16
kyzo 0:316948794d55 17 };
kyzo 0:316948794d55 18
kyzo 0:316948794d55 19
kyzo 0:316948794d55 20 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 21 ///////////////////////////// Definiranje varijabli, I/O////////////////////////////////
kyzo 0:316948794d55 22 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 23
kyzo 0:316948794d55 24 BusOut Lcd_pins(p21, p22, p23, p24); // d4, d5, d6, d7 Definiranje lcd sabirnice za upis charactera
kyzo 0:316948794d55 25 Timer timer1; // Timer za izračun rezultata
kyzo 0:316948794d55 26 DigitalOut rs_pin(p19); // LCD pin rs (register select.)
kyzo 0:316948794d55 27 DigitalOut e_pin(p20); // LCD pin e (enable).
kyzo 0:316948794d55 28 DigitalIn tipka(p14); // Tipka za kontrolu
kyzo 0:316948794d55 29 int red = 1; // Varijabla za trenutačni red
kyzo 0:316948794d55 30 int tempRed= 0; // pomoćna temp varijabla za stanje reda
kyzo 0:316948794d55 31 int stupac = 15; // broj stupaca u igri
kyzo 0:316948794d55 32 int rezultat = 0; // varijabla za rezultat u igri
kyzo 0:316948794d55 33 int highScore = 0; // varijabla za highscore (čitanje/upis -> local/log.txt)
kyzo 0:316948794d55 34 float brzinaLika = 0.20; // brzina lika/neprijatelja
kyzo 0:316948794d55 35 bool posBit = false; // flag za lokaciju lika na ekranu
kyzo 0:316948794d55 36 bool gameOver = true; // flag za kraj igre
kyzo 0:316948794d55 37
kyzo 0:316948794d55 38
kyzo 0:316948794d55 39 void igra(void); // funkcija igre
kyzo 0:316948794d55 40
kyzo 0:316948794d55 41
kyzo 0:316948794d55 42
kyzo 0:316948794d55 43 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 44 // funkcija za upis custom charactera u memoriju lcd-a, u 2 koraka jer se piše 4+4 bita/
kyzo 0:316948794d55 45 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 46
kyzo 0:316948794d55 47 void writePort(int value) { // slanje u 2 koraka jer koristimo 4bit na lcd
kyzo 0:316948794d55 48
kyzo 0:316948794d55 49 Lcd_pins = value >> 4; // shiftaj 4 bita u desno
kyzo 0:316948794d55 50 wait(0.000040f);
kyzo 0:316948794d55 51 e_pin = 0;
kyzo 0:316948794d55 52 wait(0.000040f);
kyzo 0:316948794d55 53 e_pin = 1;
kyzo 0:316948794d55 54 Lcd_pins = value;
kyzo 0:316948794d55 55 wait(0.000040f);
kyzo 0:316948794d55 56 e_pin = 0;
kyzo 0:316948794d55 57 wait(0.000040f);
kyzo 0:316948794d55 58 e_pin = 1;
kyzo 0:316948794d55 59 }
kyzo 0:316948794d55 60
kyzo 0:316948794d55 61 /////////////////////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 62 /////////////////////////////////////////////Pojava prepreka/////////////////////////////////////////////
kyzo 0:316948794d55 63 /////////////////////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 64
kyzo 0:316948794d55 65 void prepreka(void){
kyzo 0:316948794d55 66
kyzo 0:316948794d55 67
kyzo 0:316948794d55 68
kyzo 0:316948794d55 69 tempRed = red; //pospremi aktualnu vrijednost reda u temp(radi manipulacije likom)
kyzo 0:316948794d55 70 red = 1; //prebaci se u donji red
kyzo 0:316948794d55 71
kyzo 0:316948794d55 72 ///////////////punjenje donjeg reda/////////////////
kyzo 0:316948794d55 73 lcd.locate(stupac+1,red); //lociraj se na sljedeći stupac
kyzo 0:316948794d55 74 lcd.putc(2); //obriši znak/ stavi prazan char
kyzo 0:316948794d55 75 lcd.locate(stupac,red); //lociraj se na sljedeći stupac
kyzo 0:316948794d55 76 lcd.putc(3); //stavi char neprijatelja
kyzo 0:316948794d55 77
kyzo 0:316948794d55 78
kyzo 0:316948794d55 79
kyzo 0:316948794d55 80
kyzo 0:316948794d55 81 red = tempRed; //radi povratka u main vrati staru vrijednost reda
kyzo 0:316948794d55 82 stupac = stupac--; //umanji vrijednost stupca za 1
kyzo 0:316948794d55 83
kyzo 0:316948794d55 84 if(stupac == 0 && posBit == false){ //ako je neprijatelj na poziciji i lik je gore = (udarac u lika)
kyzo 0:316948794d55 85
kyzo 0:316948794d55 86 rezultat = timer1.read_ms()/1000; // pročitaj vrijednost timera i spremi kao rez
kyzo 0:316948794d55 87 lcd.cls(); // briši ekran
kyzo 0:316948794d55 88 lcd.locate(3,0); // postavi kursor
kyzo 0:316948794d55 89 lcd.printf("Game over!"); // poruka
kyzo 0:316948794d55 90 lcd.locate(3,1); // kursor novi red
kyzo 0:316948794d55 91 lcd.printf("Rezultat:%i", rezultat); // poruka
kyzo 0:316948794d55 92
kyzo 0:316948794d55 93
kyzo 0:316948794d55 94 wait(2); // pričekaj da se poruka stigne pročitati
kyzo 0:316948794d55 95
kyzo 0:316948794d55 96 if(rezultat > highScore){ // ako je trenutni rez veći od rekorda spremi ga kao novi rekord
kyzo 0:316948794d55 97 highScore = rezultat;
kyzo 0:316948794d55 98 upis(highScore);
kyzo 0:316948794d55 99 lcd.cls();
kyzo 0:316948794d55 100
kyzo 0:316948794d55 101
kyzo 0:316948794d55 102 lcd.locate(0,0); // postavi kursor
kyzo 0:316948794d55 103 lcd.printf("Novi highscore!!"); // ispiši novi rekord
kyzo 0:316948794d55 104 lcd.locate(6,1);
kyzo 0:316948794d55 105 lcd.printf("%i",highScore);
kyzo 0:316948794d55 106 wait(2); // pričekaj da se poruka stigne pročitati
kyzo 0:316948794d55 107
kyzo 0:316948794d55 108 }
kyzo 0:316948794d55 109
kyzo 0:316948794d55 110 rezultat = 0; // poništi trenutni rezultat
kyzo 0:316948794d55 111 gameOver = true; // aktiviraj gameover flag
kyzo 0:316948794d55 112
kyzo 0:316948794d55 113 igra(); // skoči u funkciju igra i kreni ispočetka
kyzo 0:316948794d55 114
kyzo 0:316948794d55 115
kyzo 0:316948794d55 116 }
kyzo 0:316948794d55 117
kyzo 0:316948794d55 118 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 119 ///////////////brisanje zaostalih znakova///////////////////////////////////////////////
kyzo 0:316948794d55 120 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 121
kyzo 0:316948794d55 122 if(stupac < 0){ //ako je kursor došao na prvo mjesto(0)
kyzo 0:316948794d55 123
kyzo 0:316948794d55 124 lcd.locate(0,1); //lociraj se na sljedeći stupac
kyzo 0:316948794d55 125 lcd.putc(2);
kyzo 0:316948794d55 126 lcd.locate(4,0); //lociraj se na sljedeći stupac
kyzo 0:316948794d55 127 lcd.putc(2);
kyzo 0:316948794d55 128 stupac = 15; //vrati ga natrag na početak
kyzo 0:316948794d55 129
kyzo 0:316948794d55 130
kyzo 0:316948794d55 131 }
kyzo 0:316948794d55 132
kyzo 0:316948794d55 133 }
kyzo 0:316948794d55 134
kyzo 0:316948794d55 135 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 136 /////////////////////////////////////////////Funkcija igre//////////////////////////////
kyzo 0:316948794d55 137 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 138
kyzo 0:316948794d55 139 void igra(void){
kyzo 0:316948794d55 140
kyzo 0:316948794d55 141
kyzo 0:316948794d55 142 lcd.cls();
kyzo 0:316948794d55 143 wait(0.010);
kyzo 0:316948794d55 144 lcd.locate(1,0); // postavi kursor
kyzo 0:316948794d55 145 lcd.printf("Pritisni tipku"); // ispiši poruku
kyzo 0:316948794d55 146 lcd.locate(4,1);
kyzo 0:316948794d55 147 lcd.printf("za start");
kyzo 0:316948794d55 148
kyzo 0:316948794d55 149 while(tipka != 1){ // ne radi ništa dok se ne pritisne tipka za start
kyzo 0:316948794d55 150 }
kyzo 0:316948794d55 151
kyzo 0:316948794d55 152 lcd.cls();
kyzo 0:316948794d55 153 wait(0.010);
kyzo 0:316948794d55 154 gameOver = false; // resetiraj gameover flag
kyzo 0:316948794d55 155
kyzo 0:316948794d55 156 timer1.reset(); // resetiraj timer za rezultat
kyzo 0:316948794d55 157 timer1.start(); // ponovo ga pokreni
kyzo 0:316948794d55 158
kyzo 0:316948794d55 159 while(gameOver == false){ // vrti petlju dok god nije kraj igre
kyzo 0:316948794d55 160
kyzo 0:316948794d55 161 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 162 ///////////////////////////////Animacija lika///////////////////////////////////////////
kyzo 0:316948794d55 163 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 164 lcd.locate(1,red);
kyzo 0:316948794d55 165 lcd.putc(0);
kyzo 0:316948794d55 166 wait(brzinaLika);
kyzo 0:316948794d55 167 lcd.locate(1,red);
kyzo 0:316948794d55 168 lcd.putc(1);
kyzo 0:316948794d55 169 wait(brzinaLika);
kyzo 0:316948794d55 170
kyzo 0:316948794d55 171 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 172 //////////////////////////////Manipulacija likom////////////////////////////////////////
kyzo 0:316948794d55 173 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 174
kyzo 0:316948794d55 175 if(tipka == 1){ //ako je pritisnuta tipka
kyzo 0:316948794d55 176 lcd.locate(1,red); //zadrži lokaciju na liku
kyzo 0:316948794d55 177 lcd.putc(2); //obriši ga (upiši prazan char)
kyzo 0:316948794d55 178 red = 0; //skoči u gornji red
kyzo 0:316948794d55 179 posBit = true; //aktiviraj flag za poziciju
kyzo 0:316948794d55 180 }
kyzo 0:316948794d55 181
kyzo 0:316948794d55 182 if(tipka != 1 && posBit == true){ //ako tipka više nije aktivna, a posBit je (bio je u gornjem redu)
kyzo 0:316948794d55 183 lcd.locate(1,red); //zadrži lokaciju na liku
kyzo 0:316948794d55 184 lcd.putc(2); //obriši ga (upiši prazan char)
kyzo 0:316948794d55 185 posBit = false; //resetiraj posbit
kyzo 0:316948794d55 186 red = 1; //vrati lika u donji red
kyzo 0:316948794d55 187 }
kyzo 0:316948794d55 188
kyzo 0:316948794d55 189 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 190 ////////////////////Poziv funkcije za pojavu prepreka///////////////////////////////////
kyzo 0:316948794d55 191 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 192
kyzo 0:316948794d55 193 prepreka();
kyzo 0:316948794d55 194
kyzo 0:316948794d55 195
kyzo 0:316948794d55 196
kyzo 0:316948794d55 197
kyzo 0:316948794d55 198 }
kyzo 0:316948794d55 199
kyzo 0:316948794d55 200 }
kyzo 0:316948794d55 201
kyzo 0:316948794d55 202 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 203 /////////////////////////////////Main funkcija//////////////////////////////////////////
kyzo 0:316948794d55 204 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 205
kyzo 0:316948794d55 206 int main() {
kyzo 0:316948794d55 207
kyzo 0:316948794d55 208 highScore = citaj(); // pročitaj aktualni rekord iz log.txt i spremi u varijablu
kyzo 0:316948794d55 209 lcd.cls();
kyzo 0:316948794d55 210 lcd.locate(2,0); // postavi kursor
kyzo 0:316948794d55 211 lcd.printf("Ucitavanje..");
kyzo 0:316948794d55 212 wait(2);
kyzo 0:316948794d55 213 lcd.cls();
kyzo 0:316948794d55 214 lcd.locate(2,0);
kyzo 0:316948794d55 215 lcd.printf("Highscore:%d", highScore); // ispiši highscore
kyzo 0:316948794d55 216 wait(2);
kyzo 0:316948794d55 217
kyzo 0:316948794d55 218
kyzo 0:316948794d55 219 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 220 /////////////////////////////Upis custom charactera u mem lcd-a/////////////////////////
kyzo 0:316948794d55 221 ////////////////////////////////////////////////////////////////////////////////////////
kyzo 0:316948794d55 222
kyzo 0:316948794d55 223 for (int j=0; j<8; j++) {
kyzo 0:316948794d55 224
kyzo 0:316948794d55 225 rs_pin = 0; // slanje komande
kyzo 0:316948794d55 226
kyzo 0:316948794d55 227
kyzo 0:316948794d55 228 writePort(0x40+8*j); // 0x40 je početna adresa, za svaki char je potrebno 8 mem lokacija
kyzo 0:316948794d55 229
kyzo 0:316948794d55 230
kyzo 0:316948794d55 231
kyzo 0:316948794d55 232 rs_pin = 1; // slanje charova
kyzo 0:316948794d55 233
kyzo 0:316948794d55 234
kyzo 0:316948794d55 235 for (int i=0; i<8; i++) {
kyzo 0:316948794d55 236 writePort(custom_char[j][i]);
kyzo 0:316948794d55 237 }
kyzo 0:316948794d55 238 }
kyzo 0:316948794d55 239
kyzo 0:316948794d55 240
kyzo 0:316948794d55 241
kyzo 0:316948794d55 242 lcd.cls();
kyzo 0:316948794d55 243 wait(0.010);
kyzo 0:316948794d55 244
kyzo 0:316948794d55 245
kyzo 0:316948794d55 246 lcd.locate(0,1);
kyzo 0:316948794d55 247
kyzo 0:316948794d55 248 igra(); // skoči u funkciju igre
kyzo 0:316948794d55 249
kyzo 0:316948794d55 250
kyzo 0:316948794d55 251
kyzo 0:316948794d55 252 }