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 SDFileSystem mbed wave_player
Fork of missile_command by
main.cpp
00001 #include "mbed.h" 00002 #include "uLCD_4DGL.h" 00003 #include "wave_player.h" 00004 #include "SDFileSystem.h" 00005 #include "segment_display.h" 00006 00007 // Include header files for missile command project 00008 #include "globals.h" 00009 #include "city_landscape_public.h" 00010 #include "missile_public.h" 00011 #include "player.h" 00012 00013 // Platform initialization 00014 DigitalIn left_pb(p23); DigitalIn right_pb(p21); DigitalIn fire_pb(p22); DigitalIn reset_pb(p24); 00015 uLCD_4DGL uLCD(p28,p27,p29); 00016 AnalogOut DACout(p18); 00017 wave_player waver(&DACout); 00018 SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs 00019 00020 00021 void playSound(char * wav); 00022 //Initialize variables 00023 PLAYER_MISSILE missileArr [5]; 00024 PLAYER player; 00025 int radius = 10; 00026 int missileCount = 5; 00027 00028 00029 00030 //draw the anti missile 00031 void player_missile_draw(PLAYER_MISSILE missile, int color) { 00032 00033 int init_x, init_y, current_x, current_y; 00034 init_x = missile.source_x; 00035 init_y = 96; 00036 current_x = init_x; 00037 current_y = missile.y; 00038 uLCD.line(init_x, init_y, current_x, current_y, color); 00039 } 00040 // create the anti missile 00041 void player_missile_create(void){ 00042 int z; 00043 for(z=0;z<5;z++){ 00044 if(missileArr[z].status == PLAYER_MISSILE_DEACTIVE){ 00045 missileArr[z].y = 96; 00046 //each missile has its own tick 00047 00048 //set a random source for the missile 00049 missileArr[z].source_x = player.x + 5; 00050 //set a random target for the missile 00051 missileArr[z].origin_y = 96; 00052 //the missile starts at its source 00053 00054 missileArr[z].status = PLAYER_MISSILE_ACTIVE; 00055 break; 00056 } 00057 } 00058 } 00059 00060 00061 00062 void player_missile_update_position(void){ 00063 int b; 00064 //controls how fast the missile will move 00065 00066 //delta_x and delta_y account for the slope of the missile 00067 double delta_y; 00068 for(b=0;b<5;b++){ 00069 if(missileArr[b].status == PLAYER_MISSILE_ACTIVE){ 00070 // update missile position 00071 delta_y = 5; 00072 00073 00074 missileArr[b].y = missileArr[b].y - delta_y; 00075 00076 00077 // draw missile 00078 player_missile_draw(missileArr[b], PLAYER_COLOR); 00079 } 00080 if(missileArr[b].y < 0) { 00081 00082 player_missile_draw(missileArr[b], BLACK_COLOR ); 00083 missileArr[b].status = PLAYER_MISSILE_DEACTIVE; 00084 00085 00086 00087 } 00088 else if(missileArr[b].status == PLAYER_MISSILE_EXPLODED){ 00089 // clear the missile on the screen 00090 player_missile_draw(missileArr[b], BLACK_COLOR); 00091 00092 00093 // we have done with this missile, remove it from record 00094 missileArr[b].status = PLAYER_MISSILE_DEACTIVE; 00095 //resets the missile's internal tick 00096 missileCount = missileCount + 1; 00097 00098 00099 } 00100 } 00101 00102 } 00103 00104 void player_set_exploded(int index){ 00105 // Error check 00106 ASSERT_P(index<MAX_NUM_MISSILE,ERROR_MISSILE_INDEX_UPDATE_STATUS); 00107 00108 missileArr[index].status = PLAYER_MISSILE_EXPLODED; 00109 missileCount = missileCount + 1; 00110 } 00111 00112 00113 00114 00115 int main() { 00116 00117 uLCD.locate(0, 0); 00118 //uLCD.printf("Lvl:", level()); 00119 //uLCD.printf("Score: %2d", s); 00120 //uLCD.prinf("Missiles: ", 00121 //uLCD.printf("Lives: ", 00122 setup_sequence(); 00123 seg_driver_initialize(); 00124 // 2.show numbers 00125 int i; 00126 for(i=0;i<10;i++){ 00127 seg_driver(i); 00128 wait(0.2); 00129 } 00130 00131 00132 playSound("/sd/wavfiles/BUZZER.wav"); 00133 00134 00135 // Draw cities 00136 city_landscape_init(4); 00137 // Initialize the buttons 00138 left_pb.mode(PullUp); // The variable left_pb will be zero when the pushbutton for moving the player left is pressed 00139 right_pb.mode(PullUp); // The variable rightt_pb will be zero when the pushbutton for moving the player right is pressed 00140 fire_pb.mode(PullUp); //the variable fire_pb will be zero when the pushbutton for firing a missile is pressed 00141 reset_pb.mode(PullUp); 00142 00143 ///Begin the game loop 00144 00145 player.x = 60; 00146 player_draw(player.x,100); 00147 int d, w, l; 00148 int s = 0; 00149 int cityCount = 4; 00150 int lives = 3; 00151 00152 00153 while(1){ 00154 00155 00156 //print Score and Lives 00157 uLCD.locate(0,0); 00158 uLCD.color(0x00FF00); 00159 uLCD.printf("Score: %2d \n", s); 00160 uLCD.printf("Lives: %2d" , lives); 00161 00162 if (reset_pb == 0) { 00163 while(1) { 00164 wait(1); 00165 if(reset_pb == 0) { 00166 break; 00167 } 00168 } 00169 } 00170 00171 00172 //If all 4 pushbuttons are pressed, jump to next level 00173 if (((left_pb == 0) && (right_pb == 0) && (fire_pb == 0) && (reset_pb == 0))) { 00174 while(1) { 00175 uLCD.filled_rectangle(0, 0, 128, 128, 0x000000); 00176 uLCD.locate(4, 5); 00177 uLCD.printf("Level 2!! \n \n"); 00178 uLCD.printf("Incoming missiles are faster!"); 00179 00180 wait(5); 00181 uLCD.locate(4,5); 00182 uLCD.color(0x000000); 00183 uLCD.printf("Level 2!! \n \n"); 00184 uLCD.printf("Incoming missiles are faster!"); 00185 break; 00186 } 00187 city_landscape_init(4); 00188 set_missile_speed(3); 00189 player_draw(player.x,100); 00190 00191 } 00192 00193 missileCount = 5; 00194 for(l = 0; l<5; l++) { 00195 if(missileArr[l].status == PLAYER_MISSILE_ACTIVE) { 00196 missileCount = missileCount - 1; 00197 } 00198 seg_driver(missileCount); 00199 } 00200 00201 00202 00203 00204 00205 missile_generator(); /// updates all incoming missiles on the screen 00206 00207 00208 if(left_pb == 0 && player.x>0){ 00209 //Move player left 00210 player_draw(player.x,100); 00211 player_delete(player.x,100); 00212 player.x = player.x - 10; 00213 player_draw(player.x,100); 00214 00215 } 00216 if(right_pb == 0 && player.x<110){ 00217 //Move player right 00218 player_draw(player.x,100); 00219 player_delete(player.x,100); 00220 player.x = player.x + 10; 00221 player_draw(player.x,100); 00222 } 00223 if(fire_pb == 0){ 00224 00225 00226 //fire missile and make laser sound 00227 player_missile_create(); 00228 00229 // 00230 playSound("/sd/wavfiles/LASER.wav"); 00231 } 00232 player_missile_update_position(); 00233 00234 //missile-player collision 00235 for ( int p=0; p<5; p++) { 00236 MISSILE missile_record = missile_get_info(p); 00237 00238 int q,w, r, t; 00239 q = player.x + 10; 00240 w = 100; 00241 r = player.x; 00242 t = 96; 00243 if((missile_record.x > r & missile_record.x<q) & (missile_record.y<w & missile_record.y>t & (missile_record.status==MISSILE_ACTIVE))) { 00244 lives -= 1; 00245 missile_set_exploded(p); 00246 wait(1); 00247 if(lives == 0) { 00248 gameover(s); 00249 00250 break; 00251 } 00252 00253 for(int j=0; j<11; j=j+3) { 00254 uLCD.circle(missile_record.x, missile_record.y, j, YELLOW_COLOR); 00255 uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR); 00256 00257 00258 } 00259 00260 00261 } 00262 } 00263 00264 00265 00266 //missile-city collision 00267 for ( int e=0; e<5; e++) { 00268 MISSILE missile_record = missile_get_info(e); 00269 for (int d = 0; d<5; d++) { 00270 CITY city_record = city_get_info(d); 00271 int f, g, h, i; 00272 f = city_record.x + city_record.width; 00273 g = city_record.y - city_record.height; 00274 h = city_record.x; 00275 i = city_record.y; 00276 if((missile_record.x > h & missile_record.x<f) & (missile_record.y<i & missile_record.y>g) & (city_record.status == EXIST)) { 00277 for(int j=0; j<11; j=j+3) { 00278 uLCD.circle(missile_record.x, missile_record.y, j, YELLOW_COLOR); 00279 uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR); 00280 00281 00282 } 00283 missile_set_exploded(e); 00284 city_destroy(d); 00285 cityCount = cityCount -1; 00286 if(cityCount == 0) { 00287 gameover(s); 00288 } 00289 00290 break; 00291 00292 } 00293 00294 } 00295 00296 00297 } 00298 00299 00300 00301 00302 00303 //missile-player_missile collision 00304 for(d=0; d<5; d++) { 00305 for(w=0; w<5; w++) { 00306 MISSILE missile_record = missile_get_info(w); 00307 double f; 00308 f = (int)sqrt(pow((double)(missile_record.x-missileArr[d].source_x),2.0) + pow((double)(missile_record.y-missileArr[d].y),2.0)); 00309 00310 if((f<radius) && (missile_record.status == MISSILE_ACTIVE) && (missileArr[d].status== PLAYER_MISSILE_ACTIVE)) { 00311 for (int j=0; j< (radius+1); j = j+3) { 00312 uLCD.circle(missile_record.x, missile_record.y, j, 0xFFFF00); 00313 00314 } 00315 for (int j=0; j<(radius+1); j=j+3) { 00316 uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR); 00317 00318 } 00319 missile_set_exploded(w); 00320 00321 player_set_exploded(d); 00322 playSound("/sd/wavfiles/hit.wav"); 00323 s= s+1; 00324 00325 if (s==10 ) { 00326 while(1) { 00327 uLCD.filled_rectangle(0, 0, 128, 128, 0x000000); 00328 uLCD.locate(4, 5); 00329 uLCD.printf("Level 2!! \n \n"); 00330 uLCD.printf("Incoming missiles are faster!"); 00331 00332 wait(5); 00333 uLCD.locate(4,5); 00334 uLCD.color(0x000000); 00335 uLCD.printf("Level 2!! \n \n"); 00336 uLCD.printf("Incoming missiles are faster!"); 00337 break; 00338 } 00339 city_landscape_init(4); 00340 set_missile_speed(3); 00341 player_draw(player.x,100); 00342 00343 } 00344 00345 00346 } 00347 00348 } 00349 00350 } 00351 00352 00353 00354 00355 } 00356 } 00357 00358 00359 00360 void playSound(char * wav) { 00361 // open wav file 00362 FILE *wave_file; 00363 wave_file=fopen(wav,"r"); 00364 00365 // play wav file 00366 waver.play(wave_file); 00367 00368 // close wav file 00369 fclose(wave_file); 00370 } 00371
Generated on Wed Jul 13 2022 03:12:57 by
1.7.2
