Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE PinDetect mbed wave_player
main.cpp
00001 #include "mbed.h" 00002 #include "uLCD_4DGL.h" 00003 #include "Spaceship.h" 00004 #include "Alien.h" 00005 #include "Shoot.h" 00006 00007 class Nav_Switch 00008 { 00009 public: 00010 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire); 00011 int read(); 00012 //boolean functions to test each switch 00013 bool up(); 00014 bool down(); 00015 bool left(); 00016 bool right(); 00017 bool fire(); 00018 //automatic read on RHS 00019 operator int (); 00020 //index to any switch array style 00021 bool operator[](int index) { 00022 return _pins[index]; 00023 }; 00024 private: 00025 BusIn _pins; 00026 00027 }; 00028 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire): 00029 _pins(up, down, left, right, fire) 00030 { 00031 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise 00032 wait(0.001); //delays just a bit for pullups to pull inputs high 00033 } 00034 inline bool Nav_Switch::up() 00035 { 00036 return !(_pins[0]); 00037 } 00038 inline bool Nav_Switch::down() 00039 { 00040 return !(_pins[1]); 00041 } 00042 inline bool Nav_Switch::left() 00043 { 00044 return !(_pins[2]); 00045 } 00046 inline bool Nav_Switch::right() 00047 { 00048 return !(_pins[3]); 00049 } 00050 inline bool Nav_Switch::fire() 00051 { 00052 return !(_pins[4]); 00053 } 00054 inline int Nav_Switch::read() 00055 { 00056 return _pins.read(); 00057 } 00058 inline Nav_Switch::operator int () 00059 { 00060 return _pins.read(); 00061 } 00062 00063 Nav_Switch myNav( p9, p6, p7, p5, p8); //pin order on Sparkfun breakout 00064 DigitalOut myled4(LED1); 00065 uLCD_4DGL 00066 uLCD(p28, p27, p30); // serial tx, serial rx, reset pin; 00067 Serial Blue(p13,p14); 00068 00069 //globals 00070 bool missExists = false; 00071 enum StateType {BEGIN, PLAY , END}; 00072 StateType STATE; 00073 int dir1 = 1, dir2 = -1; 00074 int dirs[9] = {1}; 00075 int missileX, downerX; 00076 int t; 00077 int killed = 0; 00078 00079 //global variables for main and interrupt routine 00080 volatile bool button_ready = 0; 00081 volatile int bnum = 0; 00082 volatile int bhit ; 00083 //state used to remember previous characters read in a button message 00084 enum statetype {start = 0, got_exclm, got_B, got_num, got_hit}; 00085 statetype state = start; 00086 //Interrupt routine to parse message with one new character per serial RX interrupt 00087 void parse_message() 00088 { 00089 switch (state) { 00090 case start: 00091 if (Blue.getc()=='!') state = got_exclm; 00092 else state = start; 00093 break; 00094 case got_exclm: 00095 if (Blue.getc() == 'B') state = got_B; 00096 else state = start; 00097 break; 00098 case got_B: 00099 bnum = Blue.getc(); 00100 state = got_num; 00101 break; 00102 case got_num: 00103 bhit = Blue.getc(); 00104 state = got_hit; 00105 break; 00106 case got_hit: 00107 if (Blue.getc() == char(~('!' + ' B' + bnum + bhit))) button_ready = 1; 00108 state = start; 00109 break; 00110 default: 00111 Blue.getc(); 00112 state = start; 00113 } 00114 } 00115 00116 00117 00118 00119 void menuAliens(Alien &demo, Alien &demo2) { //moves the aliens on the demo screen 00120 demo.erase(); 00121 demo2.erase(); 00122 00123 if (demo.x + 5 >= 124) { 00124 dir1 = -1; 00125 } 00126 else if (demo.x - 5 <= 5 ) { 00127 dir1 = 1; 00128 } 00129 demo.x = demo.x + dir1*3; 00130 // wait(.05); 00131 00132 00133 if (demo2.x + 5 >= 124) { 00134 dir2 = -1; 00135 } 00136 else if (demo2.x - 5 <= 5 ) { 00137 dir2 = 1; 00138 } 00139 demo2.x = demo2.x + dir2*3; 00140 00141 demo2.draw(); 00142 00143 demo.draw(); 00144 wait(0.1); 00145 } 00146 00147 00148 void moveAliens(Alien aliens[]) { 00149 aliens[0].erase(); 00150 aliens[1].erase(); 00151 aliens[2].erase(); 00152 aliens[3].erase(); 00153 aliens[4].erase(); 00154 aliens[5].erase(); 00155 aliens[6].erase(); 00156 aliens[7].erase(); 00157 aliens[8].erase(); 00158 00159 if (aliens[0].alive & aliens[0].x <= 3) { 00160 dirs[0]=1; 00161 aliens[0].y += 15; 00162 aliens[1].y += 15; 00163 aliens[2].y += 15; 00164 aliens[3].y += 15; 00165 aliens[4].y += 15; 00166 aliens[5].y += 15; 00167 aliens[6].y += 15; 00168 aliens[7].y += 15; 00169 aliens[8].y += 15; 00170 } 00171 if (aliens[0].alive & aliens[0].x >= 98) { 00172 dirs[0]=-1; 00173 aliens[0].y += 15; 00174 aliens[1].y += 15; 00175 aliens[2].y += 15; 00176 aliens[3].y += 15; 00177 aliens[4].y += 15; 00178 aliens[5].y += 15; 00179 aliens[6].y += 15; 00180 aliens[7].y += 15; 00181 aliens[8].y += 15; 00182 } 00183 aliens[0].x += 3*dirs[0]; 00184 aliens[1].x += 3*dirs[0]; 00185 aliens[2].x += 3*dirs[0]; 00186 aliens[3].x += 3*dirs[0]; 00187 aliens[4].x += 3*dirs[0]; 00188 aliens[5].x += 3*dirs[0]; 00189 aliens[6].x += 3*dirs[0]; 00190 aliens[7].x += 3*dirs[0]; 00191 aliens[8].x += 3*dirs[0]; 00192 00193 for (int k = 0; k<9; k++) 00194 { 00195 if(aliens[k].alive) 00196 { 00197 aliens[k].draw(); 00198 } 00199 } 00200 } 00201 00202 00203 00204 00205 00206 00207 int main() { 00208 00209 uLCD.baudrate(3000000); // set to 500000 to increase smooth gameplay 00210 uLCD.color(RED); 00211 uLCD.set_font(FONT_7X8); 00212 uLCD.text_width(2); //4X size text 00213 uLCD.text_height(2); //4X size text 00214 Blue.attach(&parse_message,Serial::RxIrq); 00215 00216 STATE = BEGIN; 00217 uLCD.text_mode(TRANSPARENT); 00218 00219 uLCD.locate(0,5); 00220 for (int i = 0; i < 128; i+=15) { 00221 00222 for (int j = 0; j <128; j+=15) { 00223 00224 uLCD.pixel(j, i, WHITE); 00225 00226 } 00227 00228 } 00229 uLCD.locate(3,40); 00230 uLCD.filled_rectangle(0,40,128, 80,BLUE); 00231 00232 uLCD.text_string("SPACE \n RACERS", 0, 3, FONT_7X8, RED); 00233 uLCD.text_width(1); //4X size text 00234 uLCD.text_height(1); //4X size text 00235 uLCD.text_string("Press right to \n begin!", 0, 11, FONT_7X8, RED); 00236 00237 Alien demo = Alien(110,112); 00238 Alien demo2 = Alien(2,20); 00239 00240 00241 00242 while(1) { 00243 switch (STATE) { 00244 00245 case (BEGIN): 00246 00247 menuAliens(demo, demo2); 00248 00249 if (myNav.right()) { 00250 uLCD.cls(); 00251 uLCD.text_mode(TRANSPARENT); 00252 00253 STATE = PLAY; 00254 } 00255 00256 break; 00257 00258 case (PLAY): 00259 00260 00261 00262 Spaceship ME = Spaceship(); 00263 ME.draw(); 00264 Alien aliens[9]; 00265 00266 00267 aliens[0] = Alien(10,15); 00268 aliens[1] = Alien(25,15); 00269 aliens[2] = Alien(40,15); 00270 aliens[3] = Alien(10,30); 00271 aliens[4] = Alien(25,30); 00272 aliens[5] = Alien(40,30); 00273 aliens[6] = Alien(10,45); 00274 aliens[7] = Alien(25,45); 00275 aliens[8] = Alien(40,45); 00276 Shoot missile = Shoot(ME.x, 128); 00277 Shoot downer = Shoot(-100, 200); 00278 00279 while(ME.isAlive() && killed <9) { //change to while alive 00280 00281 for (int i = 10; i < 128; i+=35) { 00282 00283 for (int j = 0; j <128; j+=35) { 00284 00285 uLCD.pixel(j, i, WHITE); 00286 00287 } 00288 00289 } 00290 00291 uLCD.filled_rectangle(0,0,128, 8,BLUE); 00292 00293 uLCD.locate(0,0); 00294 uLCD.text_width(1); //4X size text 00295 uLCD.text_height(1); //4X size text 00296 uLCD.color(RED+GREEN); 00297 uLCD.printf("Lives:%i ",3-ME.hits); 00298 uLCD.printf("Kills:%i",killed); 00299 00300 00301 00302 00303 moveAliens(aliens); 00304 00305 ME.draw(); 00306 // A1.draw(); 00307 00308 00309 00310 00311 if (myNav.up()|| (button_ready && (bnum=='5'))) { 00312 missile.erase(); 00313 missile.alive = true; 00314 missExists = true; 00315 missile.x = ME.x; 00316 missile.y = 128; 00317 missile.draw(); 00318 button_ready = 0; 00319 } 00320 00321 00322 if (myNav.left() || (button_ready && (bnum=='7')) ) { 00323 ME.erase(); 00324 00325 ME.x -= 6; 00326 ME.draw(); 00327 myled4 = !myled4; 00328 button_ready = 0; 00329 00330 } 00331 00332 00333 00334 00335 if (myNav.right() || (button_ready && (bnum=='8')) ) { 00336 ME.erase(); 00337 00338 ME.x += 6; 00339 ME.draw(); 00340 button_ready = 0; 00341 } 00342 00343 if (missile.alive) { 00344 missile.erase(); 00345 missile.y-=7; 00346 missile.draw(); 00347 } 00348 if (downer.alive) { 00349 downer.erase(); 00350 downer.y +=10; 00351 downer.x = downerX; 00352 downer.draw(); 00353 } 00354 if (missile.y - 6 <=9) { 00355 missile.alive = false; 00356 missile.erase(); 00357 missile.x = -100; 00358 missile.y = 200; 00359 } 00360 00361 for (int k = 8; k>=0; k--) 00362 { // IF U KILLED AN ALIEN 00363 if(missile.alive && aliens[k].alive && missile.x - 1<= aliens[k].x+5 & missile.x+1>= aliens[k].x-5 && missile.y-7 <= aliens[k].y+6 && missile.y>= aliens[k].y-1) 00364 {aliens[k].alive =false; 00365 aliens[k].erase(); 00366 missile.alive = false; 00367 missile.erase(); 00368 missile.x = -100; 00369 missile.y = 200; 00370 killed ++; 00371 00372 } 00373 if ( aliens[k].y+6>=125){ 00374 ME.alive = false; 00375 break; 00376 } 00377 t++; 00378 if ( aliens[k].alive && t%100==0) { 00379 downerX=aliens[k].x; 00380 downer.x = downerX; 00381 downer.y = aliens[k].y+4; 00382 downer.draw(); 00383 00384 downer.alive = true; 00385 } 00386 00387 00388 } 00389 00390 00391 if (downer.y >=128) { 00392 downer.alive = false; 00393 downer.erase(); 00394 } 00395 if (downer.y+6 >= ME.y-3 && downer.x-1 >= ME.x-5 && downer.x+1 <= ME.x+5) { 00396 ME.hits++; 00397 downer.alive =false; 00398 downer.erase(); 00399 00400 downer.x = -100; 00401 downer.y = -100; 00402 00403 uLCD.filled_circle(ME.x , ME.y , 4 , RED); 00404 wait(.2); 00405 uLCD.filled_circle(ME.x , ME.y , 4 , BLUE); 00406 wait(.2); 00407 00408 uLCD.filled_circle(ME.x , ME.y , 4 , RED); 00409 wait(.2); 00410 00411 uLCD.filled_circle(ME.x , ME.y , 4 , BLUE); 00412 00413 00414 } 00415 00416 } 00417 STATE = END; 00418 break; 00419 case (END): 00420 uLCD.cls(); 00421 uLCD.filled_rectangle(0,40,128, 80,BLUE); 00422 00423 uLCD.text_mode(TRANSPARENT); 00424 uLCD.text_width(2); //4X size text 00425 uLCD.text_height(2); //4X size text 00426 if(ME.hits==3) { 00427 uLCD.text_string("GAME \n OVER!!", 0, 3, FONT_7X8, RED); 00428 00429 } else { 00430 uLCD.text_string("YOU SAVED \nTHE WORLD!!", 0, 3, FONT_7X8, RED); 00431 } 00432 00433 00434 wait(5); 00435 00436 uLCD.text_width(1); //4X size text 00437 uLCD.text_height(1); //4X size text 00438 uLCD.color(WHITE); 00439 00440 uLCD.text_string("Press right to \n restart!", 0, 11, FONT_7X8, RED); 00441 uLCD.color(WHITE); 00442 00443 wait(1); 00444 ME.hits = 0; 00445 ME.alive = true; 00446 ME.x = 0; 00447 ME.y = 127; 00448 killed = 0; 00449 STATE = BEGIN; 00450 } 00451 00452 } 00453 }
Generated on Tue Jul 26 2022 17:28:07 by
1.7.2