Mezmure Dargie / Mbed 2 deprecated SPACERACERS

Dependencies:   4DGL-uLCD-SE PinDetect mbed wave_player

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }