prana koirala / Mbed 2 deprecated ECE2036LAB5_Final

Dependencies:   4DGL-uLCD-SE mbed PinDetect SDFileSystem mbed-rtos

Fork of mythermostat by jim hamblen

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "SDFileSystem.h"
00003 #include "uLCD_4DGL.h"
00004 #include "PinDetect.h"
00005 #include "Speaker.h"
00006 #include <string>
00007 #include <cstdlib>
00008 #include <ctime>
00009 #include <vector>
00010 #include <iterator>
00011 #include <algorithm>
00012 
00013 #define SHIP_HEIGHT 4
00014 #define SHIP_WIDTH 15
00015 #define ALIEN_HEIGHT 8
00016 #define ALIEN_WIDTH 11
00017 
00018 #define _ 0x000000 // BLACK
00019 #define X 0xFFFFFF // WHITE
00020 #define Y 0x0000FF  // Blue
00021 using namespace std;
00022 uLCD_4DGL uLCD(p28, p27, p29);
00023 Speaker mySpeaker(p21);
00024 PinDetect left(p17);
00025 PinDetect shoot(p18);
00026 PinDetect right(p16);
00027 Timer timer; // For measuring Elapsed time
00028 
00029 static int shipx = 57;
00030 static int shipy = 120;
00031 static int bulletx = 65;
00032 static int bullety = 115;
00033 static bool movement = false;
00034 static bool direction = false;
00035 static bool fire = false;
00036 int clear[8*11] = {
00037     Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
00038     Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
00039     Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
00040     Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
00041     Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
00042     Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
00043     Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
00044     Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y
00045 };
00046 
00047 int alienAli_sprite[ALIEN_HEIGHT * ALIEN_WIDTH] = {
00048     X,X,X,_,_,_,_,_,X,X,X,
00049     X,X,X,_,_,_,_,X,X,X,_,
00050     X,X,X,_,_,X,X,X,_,_,_,
00051     X,X,X,X,X,X,_,_,_,_,_,
00052     X,X,X,X,X,X,X,_,_,_,_,
00053     X,X,X,_,_,X,X,X,_,_,_,
00054     X,X,X,_,_,_,_,X,X,X,_,
00055     X,X,X,_,_,_,_,_,X,X,X
00056 };
00057 int alienAlice_sprite[ALIEN_HEIGHT * ALIEN_WIDTH] = {
00058     _,_,_,_,X,X,X,_,_,_,_,
00059     _,X,X,X,X,X,X,X,X,X,_,
00060     X,X,X,X,X,X,X,X,X,X,X,
00061     X,X,X,_,_,X,_,_,X,X,X,
00062     X,X,X,X,X,X,X,X,X,X,X,
00063     _,_,_,X,X,_,X,X,_,_,_,
00064     _,_,X,X,_,_,_,X,X,_,_,
00065     X,X,_,_,_,X,_,_,_,X,X
00066 };
00067 int alienBobDown_sprite[ALIEN_HEIGHT * ALIEN_WIDTH] = {
00068     _,_,X,_,_,_,_,_,X,_,_,
00069     _,_,_,X,_,_,_,X,_,_,_,
00070     _,_,X,X,X,X,X,X,X,_,_,
00071     _,X,X,_,X,X,X,_,X,X,_,
00072     X,X,X,X,X,X,X,X,X,X,X,
00073     X,_,X,X,X,X,X,X,X,_,X,
00074     X,_,X,_,_,_,_,_,X,_,X,
00075     _,_,_,X,X,_,X,X,_,_,_
00076 };
00077 
00078 int alienBobUp_sprite[ALIEN_HEIGHT * ALIEN_WIDTH] = {
00079     _,_,X,_,_,_,_,_,X,_,_,
00080     X,_,_,X,_,_,_,X,_,_,X,
00081     X,_,X,X,X,X,X,X,X,_,X,
00082     X,X,X,_,X,X,X,_,X,X,X,
00083     X,X,X,X,X,X,X,X,X,X,X,
00084     _,_,X,X,X,X,X,X,X,_,_,
00085     _,_,X,_,_,_,_,_,X,_,_,
00086     _,X,_,_,_,_,_,_,_,X,_
00087 };
00088 
00089 // Base Class
00090 class ScreenAliens
00091 {
00092 public:
00093     ScreenAliens(string, int, int);
00094 
00095     virtual void draw() = 0;
00096     virtual void update() = 0;
00097 
00098     void setName(string);
00099     void setxPos(int);
00100     void setyPos(int);
00101     void setDir(int);
00102 
00103     string getName();
00104     int getxPos();
00105     int getyPos();
00106     int getDir();
00107 private:
00108 
00109     string name;
00110     int xPos;
00111     int yPos;
00112     int dir;
00113 };
00114 
00115 ScreenAliens::ScreenAliens(string name, int xPos, int yPos)
00116 {
00117     setName(name);
00118     setxPos(xPos);
00119     setyPos(yPos);
00120     srand(time(NULL));
00121     int status = rand()%2;
00122     setDir(status);
00123 }
00124 
00125 void ScreenAliens::setName(string name)
00126 {
00127     this -> name = name;
00128 }
00129 
00130 void ScreenAliens::setxPos(int xPos)
00131 {
00132     this -> xPos = xPos;
00133 }
00134 
00135 void ScreenAliens::setyPos(int yPos)
00136 {
00137     this -> yPos = yPos;
00138 }
00139 
00140 void ScreenAliens::setDir(int dir)
00141 {
00142     this -> dir = dir;
00143 }
00144 
00145 string ScreenAliens::getName()
00146 {
00147     return name;
00148 }
00149 
00150 int ScreenAliens::getxPos()
00151 {
00152     return xPos;
00153 }
00154 
00155 int ScreenAliens::getyPos()
00156 {
00157     return yPos;
00158 }
00159 
00160 int ScreenAliens::getDir()
00161 {
00162     return dir;
00163 }
00164 
00165 
00166 // Derived class AlienBob
00167 class AlienBob:public ScreenAliens
00168 {
00169 
00170 public:
00171     AlienBob(int xPos, int yPos):ScreenAliens("AlienBob", xPos, yPos) {
00172         int status;
00173         srand(time(NULL));
00174         status = rand()%2;
00175         setUpDown(status);
00176     }
00177 
00178     void setUpDown(int upDown) {
00179         this -> upDown = upDown;
00180     }
00181 
00182     int getUpDown() {
00183         return upDown;
00184     }
00185 
00186     virtual void draw() {
00187         if (getUpDown() == 0) {
00188             uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH, ALIEN_HEIGHT, alienBobDown_sprite);
00189             setUpDown(1);
00190         } else {
00191             uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH, ALIEN_HEIGHT, alienBobUp_sprite);
00192             setUpDown(0);
00193         }
00194     }
00195 
00196     virtual void update() {
00197         uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH,ALIEN_HEIGHT, clear);
00198         if (ScreenAliens::getDir() == 0) {
00199             if (ScreenAliens::getxPos() - 5 <= 0 ) {
00200                 ScreenAliens::setDir(1);
00201                 ScreenAliens::setxPos(ScreenAliens::getxPos() + 5);
00202             } else {
00203                 ScreenAliens::setxPos(ScreenAliens::getxPos() - 5);
00204             }
00205             draw();
00206         } else {
00207             if (ScreenAliens::getxPos() + 5 + ALIEN_WIDTH >= 128) {
00208                 ScreenAliens::setDir(0);
00209                 ScreenAliens::setxPos(ScreenAliens::getxPos() - 5);
00210             } else {
00211                 ScreenAliens::setxPos(ScreenAliens::getxPos() + 5);
00212             }
00213             draw();
00214         }
00215     }
00216 private:
00217     int upDown;
00218 };
00219 
00220 class AlienAlice:public ScreenAliens
00221 {
00222 
00223 public:
00224     AlienAlice(int xPos, int yPos):ScreenAliens("AlienAlice", xPos, yPos) {}
00225 
00226     virtual void draw() {
00227         uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH, ALIEN_HEIGHT, alienAlice_sprite);
00228     }
00229 
00230     virtual void update() {
00231         uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH,ALIEN_HEIGHT, clear);
00232         if (ScreenAliens::getDir() == 0) {
00233             if (ScreenAliens::getxPos() - 8 <= 0 ) {
00234                 ScreenAliens::setDir(1);
00235                 ScreenAliens::setxPos(ScreenAliens::getxPos() + 8);
00236             } else {
00237                 ScreenAliens::setxPos(ScreenAliens::getxPos() - 8);
00238             }
00239             draw();
00240         } else {
00241             if (ScreenAliens::getxPos() + 8 + ALIEN_WIDTH >= 128) {
00242                 ScreenAliens::setDir(0);
00243                 ScreenAliens::setxPos(ScreenAliens::getxPos() - 8);
00244             } else {
00245                 ScreenAliens::setxPos(ScreenAliens::getxPos() + 8);
00246             }
00247             draw();
00248         }
00249     }
00250 };
00251 
00252 class AlienAli:public ScreenAliens
00253 {
00254 
00255 public:
00256 
00257     AlienAli(int xPos, int yPos):ScreenAliens("AlienAli", xPos, yPos) {}
00258 
00259     virtual void draw() {
00260         uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH, ALIEN_HEIGHT, alienAli_sprite);
00261     }
00262 
00263     virtual void update() {
00264         uLCD.BLIT(ScreenAliens::getxPos(),ScreenAliens::getyPos(), ALIEN_WIDTH,ALIEN_HEIGHT, clear);
00265         if (ScreenAliens::getDir() == 0) {
00266             if (ScreenAliens::getxPos() - 10 <= 0 ) {
00267                 ScreenAliens::setDir(1);
00268                 ScreenAliens::setxPos(ScreenAliens::getxPos() + 10);
00269             } else {
00270                 ScreenAliens::setxPos(ScreenAliens::getxPos() - 10);
00271             }
00272             draw();
00273         } else {
00274             if (ScreenAliens::getxPos() + 10 + ALIEN_WIDTH >= 128) {
00275                 ScreenAliens::setDir(0);
00276                 ScreenAliens::setxPos(ScreenAliens::getxPos() - 10);
00277             } else {
00278                 ScreenAliens::setxPos(ScreenAliens::getxPos() + 10);
00279             }
00280             draw();
00281         }
00282     }
00283 };
00284 
00285 
00286 vector <ScreenAliens*> aliens(6);
00287 
00288 //Code for the function of the pushbuttons
00289 void left_hit_callback(void)
00290 {
00291     movement = true;
00292     direction = false;
00293 }
00294 
00295 void right_hit_callback (void)
00296 {
00297     movement = true;
00298     direction = true;
00299 }
00300 
00301 void shoot_hit_callback (void)
00302 {
00303     if (!fire) {
00304         bulletx = shipx + 8;
00305     }
00306     fire = true;
00307 }
00308 void start()
00309 {
00310 
00311     srand(time(0));
00312     int randomNum[6];
00313     int xpos[6];
00314     for (int i = 0; i < aliens.size(); i++) {
00315         randomNum[i] = rand()%3 + 1;
00316         xpos[i] = rand()%117 + 1;
00317     }
00318 
00319     for (int i = 0; i < 6; i++) {
00320         if (randomNum[i] == 1) {
00321             aliens[i] = new AlienBob(xpos[i], i*10 + 10);
00322         } else if (randomNum[i] == 2) {
00323             aliens[i] = new AlienAlice(xpos[i], i*10 + 10);
00324         } else if (randomNum[i] == 3) {
00325             aliens[i] = new AlienAli(xpos[i], i*10 + 10);
00326         }
00327     }
00328 
00329     aliens[0] -> draw();
00330     aliens[1] -> draw();
00331     aliens[2] -> draw();
00332     aliens[3] -> draw();
00333     aliens[4] -> draw();
00334     aliens[5] -> draw();
00335 
00336     uLCD.filled_rectangle(shipx,shipy,shipx+SHIP_WIDTH,shipy+SHIP_HEIGHT, X);
00337 }
00338 
00339 int main()
00340 {
00341     uLCD.background_color(BLUE);     // Background color blue
00342 
00343     left.mode(PullUp);
00344     right.mode(PullUp);
00345     shoot.mode(PullUp);
00346 
00347     uLCD.printf("\n\nLAME Attack Game!");  // Welcome message
00348     wait(2.0);                      //1 pause system for 2.0
00349     uLCD.cls();                     // clear screen
00350 
00351 
00352     // Setup Interrupt callback functions for a pb hit
00353     left.attach_deasserted(&left_hit_callback);
00354     right.attach_deasserted(&right_hit_callback);
00355     shoot.attach_deasserted(&shoot_hit_callback);
00356 
00357     // Start sampling pb inputs using interrupts
00358     left.setSampleFrequency();
00359     right.setSampleFrequency();
00360     shoot.setSampleFrequency();
00361     start();
00362     timer.start();              // Starting timer to keep track how much time taken
00363     int startT = timer.read_ms();
00364     while (aliens.size() > 0) {
00365 
00366         for (int i = 0; i < aliens.size(); i++) {
00367             aliens[i] -> update();
00368         }
00369         if (fire) {
00370             uLCD.filled_rectangle(bulletx, bullety, bulletx + 2, bullety +4, Y);
00371             for (int i = 0; i < aliens.size(); i++) {
00372                 if (((*aliens[i]).getxPos()- 4 <= bulletx) && (bulletx + 2 <= (*aliens[i]).getxPos() + ALIEN_WIDTH + 4)
00373                         && ((*aliens[i]).getyPos()- 8 <= bullety) && ((*aliens[i]).getyPos()+8 >= bullety - ALIEN_HEIGHT )) {
00374                     uLCD.BLIT((*aliens[i]).getxPos(),(*aliens[i]).getyPos(), ALIEN_WIDTH,ALIEN_HEIGHT, clear);
00375                     fire = false;
00376                     bullety = 115;
00377                     aliens.erase(aliens.begin()+i);
00378                     mySpeaker.PlayNote(100.0, 0.25, 0.01);
00379                 } else if (bullety < 0) {
00380                     fire = false;
00381                     bullety = 115;
00382                 }
00383             }
00384             if (fire) {
00385                 bullety = bullety - 8;
00386                 uLCD.filled_rectangle(bulletx, bullety, bulletx + 2, bullety + 4, RED);
00387             }
00388         }
00389         if (movement) {
00390             uLCD.filled_rectangle(shipx,shipy,shipx+SHIP_WIDTH,shipy+SHIP_HEIGHT,Y);
00391             if (direction) {
00392                 if (shipx + SHIP_WIDTH + ALIEN_WIDTH > 128) {
00393                     shipx = 128-SHIP_WIDTH;
00394                 } else {
00395                     shipx = shipx + ALIEN_WIDTH;
00396                 }
00397             } else {
00398                 if (shipx - ALIEN_WIDTH < 0) {
00399                     shipx = 0;
00400                 } else {
00401                     shipx = shipx - ALIEN_WIDTH;
00402                 }
00403             }
00404             movement = false;
00405             uLCD.filled_rectangle(shipx, shipy, shipx+SHIP_WIDTH,shipy+SHIP_HEIGHT,X);
00406         }
00407     }
00408     wait(1.0);
00409     mySpeaker.PlayNote(800.0, 1.0, 0.25);
00410     int endT = timer.read_ms();
00411     timer.stop();               // End of timer
00412     int total = (endT - startT)/1000;
00413     uLCD.cls();
00414     uLCD.printf("Earth Saved!\n\n%d seconds.", total);
00415 }