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