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: mbed 4DGL-uLCD-SE PinDetect
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 }
Generated on Fri Jul 15 2022 00:38:40 by
1.7.2