Stephen Ralph / Mbed 2 deprecated Asteroids

Dependencies:   mbed 4DGL-uLCD-SE PinDetect

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 // ## MBED INCLUDES ##
00002 #include "uLCD_4DGL.h"
00003 #include "MMA8452.h"
00004 #include "Speaker.h"
00005 #include "PinDetect.h"
00006 
00007 // ## CUSTOM INCLUDES ##
00008 #include "SSE.h"
00009 #include "ConcreteAsteroid1.h"
00010 #include "ConcreteAsteroid2.h"
00011 #include "ConcreteAsteroid3.h"
00012 #include "ConcreteAsteroid4.h"
00013 #include "overlap.h"
00014 
00015 // ## MATH ##
00016 #include <math.h>
00017 
00018 // ## CUSTOM DEFINES ##
00019 #define ASTEROID_HEIGHT 12
00020 #define ASTEROID_WIDTH 15
00021 #define SPRITE_MAX 15
00022 #define EARTH_WIDTH 10
00023 #define EARTH_HEIGHT 10
00024 #define EXPLOSION1_WIDTH 20
00025 
00026 #define SCREEN_MAX 125
00027 #define SCREEN_MIN 1
00028 #define NUM_ASTEROIDS 4
00029 
00030 #define Q 0x808000 //OLIVE
00031 #define I 0x008000 //GREEN
00032 #define S 0xC0C0C0 //SILVER
00033 #define C 0x17202A //UFO GLASS
00034 #define D 0x797D7F //DARK GREY
00035 #define L 0x00FF00 //LIME
00036 #define P 0xFF00FF //PINK
00037 #define R 0xF1C40F //YELLOW
00038 #define O 0xF39C12 //ORANGE
00039 #define G 0xAAB7B8 //GREY
00040 #define _ 0x000000 //BLACK 
00041 #define X 0xFFFFFF //WHITE
00042 #define B 0x0000FF  //BLUE
00043 #define r 0xFF0000   //RED
00044 
00045 // ## VARIOUS MBED INSTANTIATIONS ##
00046 uLCD_4DGL uLCD(p28, p27, p29);
00047 Serial pc(USBTX,USBRX);
00048 MMA8452 acc(p9, p10, 40000);
00049 Speaker mySpeaker(p21);
00050 PinDetect pb1(p18);
00051 
00052 // ## GLOBAL VARS FOR BOMB BUTTON ##
00053 bool BombUsed = false;
00054 bool ExplodeAllAsteroids = false;
00055 
00056 // ## SET UP PUSHBUTTON FOR INTURRUPT ##
00057 void pb1_hit_callback (void)
00058 {
00059     if (!BombUsed ){
00060         ExplodeAllAsteroids = true;
00061         BombUsed = true;
00062         mySpeaker.PlayNote(100.0,0.25,0.1);
00063     }
00064 }
00065 // ##  SPRITES ## 
00066 int asteroid_sprite_1[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
00067     _,_,_,_,X,X,X,X,X,X,X,X,_,_,_,
00068     _,_,_,X,_,_,_,_,_,_,_,_,X,_,_,
00069     _,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
00070     _,X,_,_,_,_,_,_,_,_,_,_,X,_,_,
00071     X,X,X,X,_,_,_,_,_,_,_,_,_,X,_,
00072     _,_,_,X,_,_,_,_,_,_,_,_,_,X,_,
00073     _,_,X,_,_,_,_,_,_,_,_,_,_,X,_,
00074     _,X,_,_,_,_,_,X,_,_,_,_,_,X,_,
00075     X,_,_,_,_,_,X,X,_,_,_,_,X,_,_,
00076     _,X,_,_,_,X,_,X,_,_,_,_,X,_,_,
00077     _,_,X,_,X,_,_,X,_,_,_,X,_,_,_,
00078     _,_,_,X,_,_,_,X,X,X,X,_,_,_,_
00079 };
00080 
00081 int asteroid_sprite_2[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {   
00082     _,_,_,X,X,_,_,_,_,_,_,_,X,_,_,
00083     _,_,X,_,_,X,X,_,_,_,_,X,_,X,_,
00084     _,X,_,_,_,_,_,X,X,_,X,_,_,_,X,
00085     X,_,_,_,_,_,_,_,_,X,_,_,_,X,_,
00086     X,_,_,_,_,_,_,_,_,_,_,_,X,_,_,
00087     X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
00088     X,_,_,_,_,_,_,_,_,_,_,_,_,_,X,
00089     X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
00090     X,_,_,_,_,_,_,_,_,_,_,_,X,_,_,
00091     _,X,_,_,_,_,_,_,_,_,_,_,X,_,_,
00092     _,_,X,X,X,_,_,_,_,_,_,X,_,_,_,
00093     _,_,_,_,_,X,X,X,X,X,X,_,_,_,_
00094 };
00095 
00096 int asteroid_sprite_3[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {  
00097     _,_,_,_,X,X,X,X,X,_,_,_,_,_,_,
00098     _,_,_,_,X,_,_,_,_,X,X,_,_,_,_,
00099     _,_,_,_,_,X,_,_,_,_,_,X,X,_,_,
00100     _,X,X,X,X,_,_,_,_,_,_,_,_,_,X,
00101     X,_,_,_,_,_,_,_,_,_,_,_,_,X,X,
00102     X,_,_,_,_,_,_,_,_,_,_,X,X,_,_,
00103     X,_,_,_,_,_,_,_,_,_,X,_,_,_,_,
00104     X,X,_,_,_,_,_,_,_,_,_,X,X,X,X,
00105     _,X,_,_,_,_,_,_,_,_,_,_,_,_,X,
00106     _,_,X,_,_,_,_,_,_,X,_,_,_,X,_,
00107     _,_,_,X,_,X,X,X,X,_,X,_,X,_,_,
00108     _,_,_,_,X,_,_,_,_,_,_,X,_,_,_
00109 };
00110 
00111 int asteroid_sprite_4[ASTEROID_HEIGHT * ASTEROID_WIDTH] = { 
00112     _,_,X,X,X,_,_,_,_,X,X,X,_,_,_,
00113     _,X,_,_,X,X,_,_,X,X,_,_,X,_,_,
00114     X,_,_,_,_,_,X,X,_,_,_,_,_,X,_,
00115     _,X,_,_,_,_,_,_,_,_,_,_,_,_,X,
00116     _,_,X,_,_,_,_,_,_,_,_,_,_,X,_,
00117     _,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
00118     _,_,X,_,_,_,_,_,_,_,_,_,_,X,_,
00119     _,X,_,_,_,_,_,_,_,_,_,_,_,_,X,
00120     X,_,_,_,_,_,X,_,_,_,_,_,_,X,_,
00121     _,X,_,_,_,X,_,X,X,_,_,_,X,_,_,
00122     _,_,X,_,X,_,_,_,_,X,X,X,_,_,_,
00123     _,_,_,X,_,_,_,_,_,_,_,_,_,_,_
00124 };
00125 
00126 int spaceship_earth1[EARTH_WIDTH *EARTH_HEIGHT] = {
00127     _,_,S,S,S,S,S,S,_,_,
00128     _,S,I,I,I,I,I,I,S,_,
00129     S,I,I,I,I,I,I,I,I,S,
00130     S,I,I,I,I,I,I,I,I,S,
00131     S,I,I,I,I,I,I,I,I,S,
00132     S,I,I,I,I,I,I,I,I,S,
00133     S,I,I,I,I,I,I,I,I,S,
00134     S,I,I,I,I,I,I,I,I,S,
00135     S,I,I,I,I,I,I,I,S,_,
00136     _,S,S,S,S,S,S,S,_,_,
00137 };
00138 int exp1[EARTH_WIDTH *EARTH_HEIGHT] = {
00139     _,_,S,S,S,S,S,S,_,_,
00140     _,R,r,r,r,r,r,r,S,R,
00141     S,r,R,O,O,O,O,r,R,S,
00142     S,r,O,R,R,R,R,R,r,S,
00143     S,r,O,R,R,R,R,r,r,S,
00144     S,r,O,R,R,R,R,r,r,S,
00145     S,r,O,R,R,R,r,r,r,S,
00146     S,r,R,R,O,O,O,O,O,S,
00147     S,r,r,r,O,r,r,r,S,_,
00148     _,S,S,S,S,S,S,S,_,_,
00149 };
00150 
00151 // ## MAIN ##
00152 int main() { 
00153     // ## SETUP LCD BAUDRATE, PB PULLUP, AND SRAND ##
00154     uLCD.baudrate(300000);
00155     wait(0.2);
00156     pb1.mode(PullUp);
00157     wait(0.1);
00158     srand(time(0));
00159     
00160     
00161     // ## SET PARAMETERS FOR ACCELEROMETER ##
00162     acc.setBitDepth(MMA8452::BIT_DEPTH_12);
00163     acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G);
00164     acc.setDataRate(MMA8452::RATE_100);
00165    
00166     // ## SETUP INTURRUPT CALLBACK FUNCTION FOR A PB HIT ##
00167     pb1.attach_deasserted(&pb1_hit_callback);
00168     // ## START SAMPLING PB CALLBACK ##
00169     pb1.setSampleFrequency();
00170     
00171     // ## CREATE ARRAY OF SCREENOBJECTS (AND SHIP) ##
00172     ScreenObject *AstAry[NUM_ASTEROIDS];
00173     AstAry[0] = new ConcreteAsteroid1;
00174     AstAry[1] = new ConcreteAsteroid2;
00175     AstAry[2] = new ConcreteAsteroid3;
00176     AstAry[3] = new ConcreteAsteroid4;
00177     SSE ship;
00178     
00179     // ## SETUP TIME & ELAPSED TIME ##
00180     time_t startTime;
00181     startTime = time(0);
00182     time_t timeElapsed = time(0)-startTime;
00183     
00184     // ## GAME LOOP ##
00185     while (true){
00186         uLCD.cls();
00187         
00188         // ## TAKE TIME ELAPSED, CONVERT TO OUT OF 30SEC, SCALE TO SCREN SIZE ##
00189         timeElapsed = time(0)-startTime;
00190         double t = (double)timeElapsed;
00191         double tw = (t/30)*SCREEN_MAX;
00192         uLCD.filled_rectangle(0, 0 , SCREEN_MAX-ceil(tw) , 5, G);
00193         
00194         // ## WINNING IF STATEMENT ##
00195         if (timeElapsed >= 30){
00196             mySpeaker.PlayNote(600.0,0.25,0.2);
00197             mySpeaker.PlayNote(800.0,0.25,0.1);
00198             mySpeaker.PlayNote(900.0,0.25,0.1);
00199             uLCD.printf("\nYOU WIN!\n PRESS BUTTON TO\n RESTART");
00200             wait(1);
00201             return 0;
00202         }
00203         
00204         // ## BOMB IF STATEMENT ##
00205         if (ExplodeAllAsteroids){
00206             for(int i=0; i < NUM_ASTEROIDS; i++){
00207                 int rando = (rand() % 4);
00208                 
00209                 if (rando == 0) {
00210                     AstAry[i] = new ConcreteAsteroid1;   
00211                 } else if (rando == 1) {
00212                     AstAry[i] = new ConcreteAsteroid2;   
00213                 } else if (rando == 2) {
00214                     AstAry[i] = new ConcreteAsteroid3;   
00215                 } else {
00216                     AstAry[i] = new ConcreteAsteroid4;   
00217                 }
00218             }
00219             ExplodeAllAsteroids = false;
00220         }
00221         
00222         ship.update();
00223         
00224         // ## LOOP THROUGH ASTROID ARY, SEE IF OOB ##
00225         for(int i=0; i < NUM_ASTEROIDS; i++){
00226             AstAry[i]->update();
00227             if(AstAry[i]->outB()){
00228                 int rando = (rand() % 4);
00229                 
00230                 if (rando == 0) {
00231                     AstAry[i] = new ConcreteAsteroid1;   
00232                 } else if (rando == 1) {
00233                     AstAry[i] = new ConcreteAsteroid2;   
00234                 } else if (rando == 2) {
00235                     AstAry[i] = new ConcreteAsteroid3;   
00236                 } else {
00237                     AstAry[i] = new ConcreteAsteroid4;   
00238                 }
00239             }
00240             
00241             // ## LOSING IF STATEMENT ##
00242             if(overlap( ship, *AstAry[i])){
00243                 uLCD.BLIT(ship.xpos, ship.ypos, EARTH_WIDTH, EARTH_HEIGHT, exp1);
00244                 mySpeaker.PlayNote(800.0,0.25,0.1);
00245                 mySpeaker.PlayNote(400.0,0.25,0.1);
00246                 mySpeaker.PlayNote(200.0,0.25,0.1);
00247                 uLCD.printf("\nGAME OVER\n");
00248                 wait(2);
00249                 return 0;
00250             }
00251             AstAry[i]->draw();
00252         }
00253         ship.draw();
00254         wait(.1);
00255     }
00256 }