Johnathan Chin / Mbed 2 deprecated Lab5

Dependencies:   4DGL-uLCD-SE PinDetect mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "MMA8452.h"
00003 #include "ScreenObject.h"
00004 #include "SpaceShipEarth.h"
00005 #include "Asteroid1.h"
00006 #include "Asteroid2.h"
00007 #include "Asteroid3.h"
00008 #include "Asteroid4.h"
00009 #include "PinDetect.h"
00010 #include "Speaker.h"
00011 #include <ctime>
00012 
00013 int asteroid_sprite_1[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
00014  _,_,_,_,X,X,X,X,X,X,X,X,_,_,_,
00015  _,_,_,X,_,_,_,_,_,_,_,_,X,_,_,
00016  _,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
00017  _,X,_,_,_,_,_,_,_,_,_,_,X,_,_,
00018  X,X,X,X,_,_,_,_,_,_,_,_,_,X,_,
00019  _,_,_,X,_,_,_,_,_,_,_,_,_,X,_,
00020  _,_,X,_,_,_,_,_,_,_,_,_,_,X,_,
00021  _,X,_,_,_,_,_,X,_,_,_,_,_,X,_,
00022  X,_,_,_,_,_,X,X,_,_,_,_,X,_,_,
00023  _,X,_,_,_,X,_,X,_,_,_,_,X,_,_,
00024  _,_,X,_,X,_,_,X,_,_,_,X,_,_,_,
00025  _,_,_,X,_,_,_,X,X,X,X,_,_,_,_
00026 
00027 };
00028 
00029 int asteroid_sprite_2[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
00030  _,_,_,X,_,_,_,_,_,X,_,_,_,_,_,
00031  _,_,X,_,X,_,_,_,X,_,X,_,_,_,_,
00032  _,X,_,_,_,X,_,X,_,_,_,X,_,_,_,
00033  X,_,_,_,_,_,X,_,_,_,_,_,X,_,_,
00034  X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
00035  X,_,_,_,_,_,_,_,_,_,_,_,_,_,X,
00036  X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
00037  X,_,_,_,_,_,_,_,_,_,_,_,X,_,_,
00038  X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
00039  _,X,_,_,_,_,_,_,_,_,_,_,_,_,X,
00040  _,_,X,_,_,_,_,_,_,_,_,_,_,X,_,
00041  _,_,_,X,X,X,X,X,X,X,X,X,X,_,_
00042 
00043 };
00044 
00045 int asteroid_sprite_3[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
00046  _,_,_,X,X,X,X,X,X,X,X,X,_,_,_,
00047  _,_,_,X,_,_,_,_,_,_,_,_,X,_,_,
00048  _,_,_,_,X,_,_,_,_,_,_,_,_,X,_,
00049  X,X,X,X,X,X,_,_,_,_,_,X,X,X,_,
00050  X,_,_,_,_,_,_,_,X,X,X,_,_,_,_,
00051  X,_,_,_,_,_,_,X,_,_,_,_,_,_,_,
00052  X,_,_,_,_,_,_,_,X,X,X,_,_,_,_,
00053  X,_,_,_,_,_,_,_,_,_,_,X,X,X,_,
00054  X,_,_,_,_,_,_,_,_,_,_,_,_,_,X,
00055  _,X,_,_,_,_,_,_,X,X,X,_,_,_,X,
00056  _,_,X,_,_,X,X,X,_,_,_,X,_,X,_,
00057  _,_,_,X,X,_,_,_,_,_,_,_,X,_,_
00058 
00059 };
00060 
00061 int asteroid_sprite_4[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
00062  _,_,_,X,_,_,_,_,_,_,_,X,_,_,_,
00063  _,X,X,_,X,X,_,_,_,X,X,_,X,_,_,
00064  X,_,_,_,_,_,X,X,X,_,_,_,_,X,_,
00065  _,X,_,_,_,_,_,_,_,_,_,_,_,_,X,
00066  _,X,_,_,_,_,_,_,_,_,_,_,_,_,X,
00067  _,_,X,_,_,_,_,_,_,_,_,_,X,X,_,
00068  _,_,X,_,_,_,_,_,_,_,_,X,_,_,_,
00069  _,X,_,_,_,_,_,_,_,_,_,_,X,X,_,
00070  _,X,_,_,_,X,_,_,_,_,_,_,_,_,X,
00071  X,_,_,_,X,_,X,X,_,_,_,_,_,X,_,
00072  _,X,_,X,_,_,_,_,X,X,_,_,X,_,_,
00073  _,_,X,_,_,_,_,_,_,_,X,X,_,_,_
00074 
00075 };
00076 
00077 int explosion[EARTH_HEIGHT * EARTH_WIDTH] = {
00078     _,_,r,_,_,r,_,_,_,_,
00079     _,r,r,_,r,O,r,_,_,_,
00080     r,O,O,r,O,R,O,r,_,r,
00081     _,r,O,R,R,R,R,O,r,r,
00082     _,_,r,O,R,R,R,R,O,r,
00083     _,r,O,R,R,R,R,O,r,_,
00084     _,r,O,R,R,R,R,O,r,_,
00085     r,O,O,r,O,r,r,O,O,r,
00086     r,O,r,_,r,_,_,r,O,r,
00087     _,r,_,_,_,_,_,_,r,r,
00088 };
00089 
00090 int erase[EARTH_WIDTH * EARTH_HEIGHT] = {
00091     _,_,_,_,_,_,_,_,_,_,
00092     _,_,_,_,_,_,_,_,_,_,
00093     _,_,_,_,_,_,_,_,_,_,
00094     _,_,_,_,_,_,_,_,_,_,
00095     _,_,_,_,_,_,_,_,_,_,
00096     _,_,_,_,_,_,_,_,_,_,
00097     _,_,_,_,_,_,_,_,_,_,
00098     _,_,_,_,_,_,_,_,_,_,
00099     _,_,_,_,_,_,_,_,_,_,
00100     _,_,_,_,_,_,_,_,_,_, 
00101 };
00102 
00103 bool bombUsed = false;
00104 bool explodeAllAsteroids = false;
00105 
00106 Asteroid1::Asteroid1() {
00107     setX((rand() % (64 - EARTH_WIDTH - ASTEROID_WIDTH) + (ASTEROID_WIDTH / 2)));
00108     setY((rand() % (64 - EARTH_HEIGHT - ASTEROID_HEIGHT)
00109         + (ASTEROID_HEIGHT / 2)));
00110     setX((rand() % 2 == 0) ? getX() : 128 - getX());
00111     setY((rand() % 2 == 0) ? getY() : 128 - getY());
00112     setXPath((rand() % 2 + 1) * (getX() > 63 ? -1 : 1));
00113     setYPath((rand() % 2 + 1) * (getY() > 63 ? -1 : 1));
00114     setSpeed(1);
00115     setSprite(asteroid_sprite_1);
00116     setDestroyed(false);
00117     setHeight(ASTEROID_HEIGHT);
00118     setWidth(ASTEROID_WIDTH);
00119 }
00120 
00121 Asteroid2::Asteroid2() {
00122     setX((rand() % (64 - EARTH_WIDTH - ASTEROID_WIDTH) + (ASTEROID_WIDTH / 2)));
00123     setY((rand() % (64 - EARTH_HEIGHT - ASTEROID_HEIGHT)
00124         + (ASTEROID_HEIGHT / 2)));
00125     setX((rand() % 2 == 0) ? getX() : 128 - getX());
00126     setY((rand() % 2 == 0) ? getY() : 128 - getY());
00127     setXPath((rand() % 4 + 1) * (getX() > 63 ? -1 : 1));
00128     setYPath((rand() % 4 + 1) * (getY() > 63 ? -1 : 1));
00129     setSpeed(1);
00130     setSprite(asteroid_sprite_2);
00131     setDestroyed(false);
00132     setHeight(ASTEROID_HEIGHT);
00133     setWidth(ASTEROID_WIDTH);
00134 }
00135 
00136 Asteroid3::Asteroid3() {
00137     setX((rand() % (64 - EARTH_WIDTH - ASTEROID_WIDTH) + (ASTEROID_WIDTH / 2)));
00138     setY((rand() % (64 - EARTH_HEIGHT - ASTEROID_HEIGHT)
00139         + (ASTEROID_HEIGHT / 2)));
00140     setX((rand() % 2 == 0) ? getX() : 128 - getX());
00141     setY((rand() % 2 == 0) ? getY() : 128 - getY());
00142     setXPath((rand() % 2 + 1) * (getX() > 63 ? -1 : 1));
00143     setYPath((rand() % 2 + 1) * (getY() > 63 ? -1 : 1));
00144     setSpeed(1);
00145     setSprite(asteroid_sprite_3);
00146     setDestroyed(false);
00147     setHeight(ASTEROID_HEIGHT);
00148     setWidth(ASTEROID_WIDTH);
00149 }
00150 
00151 Asteroid4::Asteroid4() {
00152     setX((rand() % (64 - EARTH_WIDTH - ASTEROID_WIDTH) + (ASTEROID_WIDTH / 2)));
00153     setY((rand() % (64 - EARTH_HEIGHT - ASTEROID_HEIGHT)
00154         + (ASTEROID_HEIGHT / 2)));
00155     setX((rand() % 2 == 0) ? getX() : 128 - getX());
00156     setY((rand() % 2 == 0) ? getY() : 128 - getY());
00157     setXPath((rand() % 2 + 1) * (getX() > 63 ? -1 : 1));
00158     setYPath((rand() % 2 + 1) * (getY() > 63 ? -1 : 1));
00159     setSpeed(1);
00160     setSprite(asteroid_sprite_4);
00161     setDestroyed(false);
00162     setHeight(ASTEROID_HEIGHT);
00163     setWidth(ASTEROID_WIDTH);
00164 }
00165 
00166 
00167 bool overlap(ScreenObject & object1, ScreenObject & object2) {
00168     int delX = object1.getX() - object2.getX();
00169     int delY = object1.getY() - object2.getY();
00170     delX = (delX > 0 ? delX : -delX);
00171     delY = (delY > 0 ? delY : -delY);
00172     if (delX < (object1.getWidth() + object2.getWidth()) / 2) {
00173         if (delY < (object1.getHeight() + object2.getHeight()) / 2) {
00174             return true;
00175         }
00176     }
00177     return false;
00178 }
00179 
00180 
00181 void pb1_hit_callback(void) {
00182     if (!bombUsed) {
00183         explodeAllAsteroids = true;
00184         bombUsed = true;
00185         return;
00186     }
00187     return;
00188 }
00189 
00190 Serial pc(USBTX,USBRX);
00191 PinDetect pb1(p16);
00192 Speaker mySpeaker(p21);
00193 
00194 int main() {
00195     set_time(0);
00196     pb1.mode(PullUp);
00197     wait(0.1);
00198     pb1.attach_deasserted(&pb1_hit_callback);
00199     pb1.setSampleFrequency();    
00200     uLCD_4DGL uLCD(p28, p27, p29);
00201     uLCD.baudrate(300000);
00202     wait(0.2);
00203     srand(time(0)); // do this srand call here ONLY... no where else in the code!
00204 
00205     ScreenObject * ActiveAsteroids[NUM_ASTEROIDS];
00206     for (int i = 0; i < NUM_ASTEROIDS; i++) {
00207         int asteroidNum = rand() % 4 + 1;
00208         switch (asteroidNum) {
00209             case 1:
00210                 ActiveAsteroids[i] = new Asteroid1;
00211                 break;
00212             case 2:
00213                 ActiveAsteroids[i] = new Asteroid2;
00214                 break;
00215             case 3:
00216                 ActiveAsteroids[i] = new Asteroid3;
00217                 break;
00218             case 4:
00219                 ActiveAsteroids[i] = new Asteroid4;
00220                 break;
00221         }
00222     }
00223     
00224     SpaceShipEarth ship;
00225     double x = 0.0, y = 0.0, z = 0.0, factor = 50.0;
00226     int offsetx = 63;
00227     int offsety = 63;
00228     MMA8452 acc(p9, p10, 40000);
00229     acc.setBitDepth(MMA8452::BIT_DEPTH_12);
00230     acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G);
00231     acc.setDataRate(MMA8452::RATE_100);
00232     
00233     bool gameOver = false;
00234     bool gameWon = false;
00235     time_t startTime;
00236     startTime = time(0);
00237     time_t timeElapsed = time(0)-startTime;
00238     
00239     uLCD.filled_rectangle(0, 0, 127, 2, B); 
00240     mySpeaker.PlayNote(400.0, .25, .1);
00241     wait(0.2);
00242     mySpeaker.PlayNote(200.0, .25, .1);
00243     wait(0.2);
00244     mySpeaker.PlayNote(100.0, .25, .1);
00245     while (!gameOver) {
00246         if (timeElapsed >= 30) {
00247             gameWon = true;
00248             gameOver = true;
00249         } 
00250         uLCD.filled_rectangle(127 - (127*timeElapsed)/30, 0, 127, 2, _);
00251         if (explodeAllAsteroids) {
00252             for (int i = 0; i < NUM_ASTEROIDS; i++) {
00253                 ActiveAsteroids[i]->update();
00254                 uLCD.BLIT(ActiveAsteroids[i]->getX() - (EARTH_WIDTH / 2),
00255                         ActiveAsteroids[i]->getY() - (EARTH_HEIGHT / 2),
00256                         EARTH_WIDTH, EARTH_HEIGHT, explosion);
00257                 mySpeaker.PlayNote(100.0, .1, .2);
00258                 wait(0.1);
00259                 mySpeaker.PlayNote(50.0, .1, .2);
00260                 uLCD.BLIT(ActiveAsteroids[i]->getX() - (EARTH_WIDTH / 2),
00261                         ActiveAsteroids[i]->getY() - (EARTH_HEIGHT / 2),
00262                         EARTH_WIDTH, EARTH_HEIGHT, erase);
00263                 delete ActiveAsteroids[i];
00264                 int asteroidNum = rand() % 4 + 1;
00265                 switch (asteroidNum) {
00266                     case 1:
00267                         ActiveAsteroids[i] = new Asteroid1;
00268                         break;
00269                     case 2:
00270                         ActiveAsteroids[i] = new Asteroid2;
00271                         break;
00272                     case 3:
00273                         ActiveAsteroids[i] = new Asteroid3;
00274                         break;
00275                     case 4:
00276                         ActiveAsteroids[i] = new Asteroid4;
00277                         break;
00278                 }
00279             }
00280             explodeAllAsteroids = false;    
00281         }
00282         timeElapsed = time(0) - startTime;
00283         ship.update();
00284         for (int i = 0; i < NUM_ASTEROIDS; i++) {
00285             ActiveAsteroids[i]->update();
00286         }
00287         if (!acc.isXYZReady()) {
00288             wait(.01);
00289         } else {
00290             acc.readXYZGravity(&y, &x, &z);
00291             ship.setX(-1 * x * factor + offsetx);
00292             ship.setY(-1 * y * factor + offsety);
00293             ship.draw();
00294             for (int i = 0; i < NUM_ASTEROIDS; i++) {
00295                 if (ActiveAsteroids[i]->getDestroyed()) {
00296                     delete ActiveAsteroids[i];
00297                     int asteroidNum = rand() % 4 + 1;
00298                     switch (asteroidNum) {
00299                         case 1:
00300                             ActiveAsteroids[i] = new Asteroid1;
00301                             break;
00302                         case 2:
00303                             ActiveAsteroids[i] = new Asteroid2;
00304                             break;
00305                         case 3:
00306                             ActiveAsteroids[i] = new Asteroid3;
00307                             break;
00308                         case 4:
00309                             ActiveAsteroids[i] = new Asteroid4;
00310                             break;
00311                     }
00312                 }
00313                 ActiveAsteroids[i]->draw();
00314                 if (overlap(ship, *ActiveAsteroids[i])) {
00315                     gameOver = true;
00316                     mySpeaker.PlayNote(100.0, .1, .1);                                        
00317                     uLCD.BLIT(ship.getX() - (EARTH_WIDTH / 2),
00318                         ship.getY() - (EARTH_HEIGHT / 2),
00319                         EARTH_WIDTH, EARTH_HEIGHT, explosion);
00320                     mySpeaker.PlayNote(50.0, .1, .1);
00321                 }
00322             }
00323         }
00324     }
00325     ship.update();
00326     for (int i = 0; i < NUM_ASTEROIDS; i++) {
00327         ActiveAsteroids[i]->update();
00328     }
00329     if (gameWon) {
00330         uLCD.printf("You Won!");
00331         mySpeaker.PlayNote(200.0, .2, .1);
00332         wait(.1);
00333         mySpeaker.PlayNote(800.0, .2, .1);
00334     } else {
00335         uLCD.printf("You lose...");
00336     }
00337 }