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@0:316948794d55, 2018-11-19 (annotated)
- Committer:
- kyzo
- Date:
- Mon Nov 19 13:22:48 2018 +0000
- Revision:
- 0:316948794d55
Prva verzija
Who changed what in which revision?
User | Revision | Line number | New 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 | } |