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 mbed PinDetect SDFileSystem mbed-rtos
Fork of mythermostat by
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 }
Generated on Tue Jul 19 2022 02:03:40 by
1.7.2
