Ben Evans University Second Year Project. Game Called Defender.

Dependencies:   mbed

https://os.mbed.com/media/uploads/evanso/84bc1a30759fd6a1e3f1fd1fae3e97c2.png

Hello, soldier, you have been specially selected as the defender of planet earth.

Your mission, if you choose to accept it. Fly around the planet and pulverise invading alien ships for as long as you can. Stop the aliens abducting the innocent people on the ground. Be warned if an alien ship manages to abduct a person and take them to top of the screen, they will no longer move randomly and will begin to hunt you down. This sounds like a challenge you were trained for.

But don’t worry soldier you’re not going into battle empty-handed. Your ship is equipped with a state of the art laser beam that has unlimited ammo and four smart bombs that will destroy anything on the screen. The ship also has three lives so use them wisely.

As time goes on more alien ships will arrive on planet earth increasing the difficulty of your mission. And remember the landscape bellow loops around so if you continually fly in the same direction you go to your original position. Good luck soldier.

Committer:
evanso
Date:
Wed May 27 02:06:05 2020 +0000
Revision:
87:832ca78426b5
Parent:
86:eecd168c3a23
Final Submission. I have read and agreed with Statement of Academic Integrity.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evanso 8:dd1037c5435b 1 #include "GameEngine.h"
evanso 67:a2984682d641 2
evanso 85:87bc28b151d8 3 /** Define accelerometer object */
evanso 47:49fa1adc10b4 4 FXOS8700CQ accelerometer(I2C_SDA,I2C_SCL);
evanso 8:dd1037c5435b 5
evanso 49:ed569eceeaa4 6 /** Define SD card object */
evanso 49:ed569eceeaa4 7 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
evanso 67:a2984682d641 8
evanso 8:dd1037c5435b 9 GameEngine::GameEngine() {
evanso 44:2d957de3bce3 10 //attach ticker to isr
evanso 42:3aed75338272 11 ticker.attach(callback(this, &GameEngine::lcd_frame_time_isr), 0.04 );
evanso 8:dd1037c5435b 12 }
evanso 8:dd1037c5435b 13
evanso 8:dd1037c5435b 14 GameEngine::~GameEngine() {
evanso 8:dd1037c5435b 15
evanso 8:dd1037c5435b 16 }
evanso 8:dd1037c5435b 17
evanso 13:12276eed13ac 18 void GameEngine::init() {
evanso 85:87bc28b151d8 19 // Initialise objects
evanso 8:dd1037c5435b 20 pad.init();
evanso 8:dd1037c5435b 21 lcd.init();
evanso 8:dd1037c5435b 22 spaceship.init();
evanso 13:12276eed13ac 23 map.init(pad);
evanso 40:71f947254fda 24 menu.init();
evanso 47:49fa1adc10b4 25 accelerometer.init();
evanso 67:a2984682d641 26 saved.init();
evanso 69:753ba27325ce 27 setting.init();
evanso 77:2ee9d1f9e282 28 h_score.init();
evanso 72:e7492591307e 29
evanso 82:3211b31e9421 30 // Set first screen to main menu
evanso 58:a9a39424df52 31 current_menu_part_= menu.get_current_menu_part();
evanso 36:27aa597db3d2 32
evanso 82:3211b31e9421 33 // Launch screen
evanso 81:78c461e6770b 34 lcd.printString("Evans Studios",3,2);
evanso 81:78c461e6770b 35 lcd.printString("Presents:",15,3);
evanso 81:78c461e6770b 36 lcd.refresh();
evanso 81:78c461e6770b 37 wait(3);
evanso 81:78c461e6770b 38
evanso 74:6827b43c689d 39 play_music();
evanso 82:3211b31e9421 40
evanso 36:27aa597db3d2 41 // Set seed value
evanso 36:27aa597db3d2 42 srand(pad.read_adc()*64000);
evanso 67:a2984682d641 43
evanso 85:87bc28b151d8 44 // Had to include save test here as getting the error sd couldn’t be created
evanso 67:a2984682d641 45 #ifdef SD_TEST
evanso 79:66bcf8fa2d2d 46 saved.run_save_test(sd,lcd);
evanso 79:66bcf8fa2d2d 47 h_score.run_save_test(sd,lcd);
evanso 67:a2984682d641 48 #endif
evanso 8:dd1037c5435b 49 }
evanso 8:dd1037c5435b 50
evanso 82:3211b31e9421 51 void GameEngine::lcd_frame_time_isr() {
evanso 82:3211b31e9421 52 // Set ISR flag
evanso 64:e9dfc35a1738 53 lcd_frame_time_flag_ = 1;
evanso 64:e9dfc35a1738 54 }
evanso 64:e9dfc35a1738 55
evanso 44:2d957de3bce3 56 // Menu Control-----------------------------------------------------------------
evanso 44:2d957de3bce3 57
evanso 82:3211b31e9421 58 void GameEngine::game_select_part() {
evanso 44:2d957de3bce3 59 switch (current_menu_part_) {
evanso 44:2d957de3bce3 60 case main_menu: run_menu(); break;
evanso 44:2d957de3bce3 61 case play: run_play(); break;
evanso 44:2d957de3bce3 62 case settings: run_settings(); break;
evanso 44:2d957de3bce3 63 case saved_games: run_saved_games(); break;
evanso 76:6daba3002424 64 case high_score: run_highscore(); break;
evanso 44:2d957de3bce3 65 }
evanso 44:2d957de3bce3 66 }
evanso 44:2d957de3bce3 67
evanso 82:3211b31e9421 68 void GameEngine::run_menu() {
evanso 44:2d957de3bce3 69 lcd.setContrast(pad.read_pot1());
evanso 44:2d957de3bce3 70 lcd.clear();
evanso 87:832ca78426b5 71 pad.reset_buttons();
evanso 64:e9dfc35a1738 72
evanso 85:87bc28b151d8 73 // Scrolls, draws and selects menu parts
evanso 44:2d957de3bce3 74 read_joystick_direction();
evanso 65:daa792a09e1f 75 menu.menu_scroll(d_);
evanso 44:2d957de3bce3 76 menu.draw_part(lcd);
evanso 65:daa792a09e1f 77 menu.select_part(pad.A_pressed());
evanso 69:753ba27325ce 78
evanso 44:2d957de3bce3 79 current_menu_part_ = menu.get_current_menu_part();
evanso 69:753ba27325ce 80
evanso 82:3211b31e9421 81 // Sets sound and music setting
evanso 73:d1aea9b8da92 82 sound_fx_ = setting.get_sound_method();
evanso 74:6827b43c689d 83 music_fx_ = setting.get_music_method();
evanso 85:87bc28b151d8 84 if (music_fx_ == music_off){
evanso 85:87bc28b151d8 85 stop_music();
evanso 85:87bc28b151d8 86 }
evanso 86:eecd168c3a23 87 music_flag_ = true;
evanso 74:6827b43c689d 88
evanso 82:3211b31e9421 89 // printf("sound%d\n",sound_fx_ );
evanso 70:8c4572d17441 90
evanso 85:87bc28b151d8 91 // Initialise the game if play
evanso 82:3211b31e9421 92 if (current_menu_part_ == play) {
evanso 59:0b2e43312d6b 93 play_init();
evanso 59:0b2e43312d6b 94 }
evanso 87:832ca78426b5 95
evanso 87:832ca78426b5 96 pad.reset_buttons();
evanso 64:e9dfc35a1738 97 lcd.refresh();
evanso 44:2d957de3bce3 98 }
evanso 44:2d957de3bce3 99
evanso 84:f61c85a5f13a 100 void GameEngine::loading_screen(){
evanso 84:f61c85a5f13a 101 lcd.clear();
evanso 84:f61c85a5f13a 102
evanso 84:f61c85a5f13a 103 // Draws adding dots 3 times
evanso 85:87bc28b151d8 104 for (int x = 0; x <= 2; x++) {
evanso 84:f61c85a5f13a 105 lcd.printString("Loading",15,3);
evanso 84:f61c85a5f13a 106 lcd.refresh();
evanso 84:f61c85a5f13a 107
evanso 84:f61c85a5f13a 108 // Adds loading dots
evanso 85:87bc28b151d8 109 for (int i = 0; i <= 3; i++) {
evanso 84:f61c85a5f13a 110 wait(0.25);
evanso 84:f61c85a5f13a 111 lcd.printString(".",57+(i*6),3);
evanso 84:f61c85a5f13a 112 lcd.refresh();
evanso 84:f61c85a5f13a 113 }
evanso 84:f61c85a5f13a 114 lcd.clear();
evanso 84:f61c85a5f13a 115 }
evanso 84:f61c85a5f13a 116 }
evanso 64:e9dfc35a1738 117
evanso 64:e9dfc35a1738 118
evanso 64:e9dfc35a1738 119
evanso 64:e9dfc35a1738 120 // Menu Play -------------------------------------------------------------------
evanso 58:a9a39424df52 121
evanso 82:3211b31e9421 122 void GameEngine::run_play() {
evanso 84:f61c85a5f13a 123 loading_screen();
evanso 84:f61c85a5f13a 124
evanso 82:3211b31e9421 125 // Stops melody playing
evanso 85:87bc28b151d8 126 stop_music();
evanso 81:78c461e6770b 127
evanso 85:87bc28b151d8 128 // Main gameplay loop to run playable part of game, pause and save screens
evanso 44:2d957de3bce3 129 while (1) {
evanso 85:87bc28b151d8 130 // Timer interrupt to set frame rate of game
evanso 45:fc3238cd28c6 131 if (lcd_frame_time_flag_) {
evanso 82:3211b31e9421 132 // Resets ISR flag
evanso 45:fc3238cd28c6 133 lcd_frame_time_flag_ = 0;
evanso 44:2d957de3bce3 134
evanso 85:87bc28b151d8 135 // Selects the different parts of the game
evanso 85:87bc28b151d8 136 play_select();
evanso 44:2d957de3bce3 137
evanso 85:87bc28b151d8 138 // Break out of run play loop when lives = 0 or exited flag set
evanso 84:f61c85a5f13a 139 if (!spaceship_lives_||exit_flag_) {
evanso 87:832ca78426b5 140 // Only draw game over screen if run out of lives
evanso 84:f61c85a5f13a 141 if (!spaceship_lives_) {
evanso 84:f61c85a5f13a 142 draw_game_over_screen();
evanso 84:f61c85a5f13a 143 }
evanso 81:78c461e6770b 144 reset_map();
evanso 81:78c461e6770b 145 pad.leds_off();
evanso 81:78c461e6770b 146 break;
evanso 84:f61c85a5f13a 147 }
evanso 44:2d957de3bce3 148 }
evanso 44:2d957de3bce3 149
evanso 64:e9dfc35a1738 150 // MCU put to sleep between each frame to save power
evanso 64:e9dfc35a1738 151 sleep();
evanso 57:d4ce42c24561 152 }
evanso 85:87bc28b151d8 153 play_music();
evanso 87:832ca78426b5 154 wait(0.3);
evanso 74:6827b43c689d 155 }
evanso 74:6827b43c689d 156
evanso 85:87bc28b151d8 157 void GameEngine::play_select(){
evanso 84:f61c85a5f13a 158 // Pause button pressed
evanso 84:f61c85a5f13a 159 if (pad.start_pressed() && paused_counter_ > 10 ) {
evanso 85:87bc28b151d8 160 paused_button_pressed_ = !paused_button_pressed_;
evanso 84:f61c85a5f13a 161 paused_counter_ = 0 ;
evanso 84:f61c85a5f13a 162 run_save_a_game_flag_ = false;
evanso 84:f61c85a5f13a 163 }
evanso 84:f61c85a5f13a 164
evanso 85:87bc28b151d8 165 // Stopped double press of pause button
evanso 84:f61c85a5f13a 166 paused_counter_++;
evanso 84:f61c85a5f13a 167
evanso 85:87bc28b151d8 168 // Draws pause screen if paused button pressed
evanso 85:87bc28b151d8 169 if (paused_button_pressed_) {
evanso 84:f61c85a5f13a 170 run_paused_game();
evanso 84:f61c85a5f13a 171
evanso 84:f61c85a5f13a 172 // Otherwise draw gameplay screen
evanso 84:f61c85a5f13a 173 }else{
evanso 84:f61c85a5f13a 174 gameplay_loop();
evanso 84:f61c85a5f13a 175 }
evanso 84:f61c85a5f13a 176
evanso 84:f61c85a5f13a 177
evanso 84:f61c85a5f13a 178 }
evanso 84:f61c85a5f13a 179
evanso 82:3211b31e9421 180 void GameEngine::play_music() {
evanso 84:f61c85a5f13a 181 if (music_fx_ == music_on) {
evanso 74:6827b43c689d 182 pad.play_melody(88, star_wars, star_wars_note_time, 108, true);
evanso 74:6827b43c689d 183 }
evanso 74:6827b43c689d 184
evanso 74:6827b43c689d 185 }
evanso 74:6827b43c689d 186
evanso 82:3211b31e9421 187 void GameEngine::stop_music() {
evanso 85:87bc28b151d8 188 pad.play_melody(1, melody_off, melody_off_note_time, 1, false);
evanso 44:2d957de3bce3 189 }
evanso 44:2d957de3bce3 190
evanso 82:3211b31e9421 191 void GameEngine::play_init() {
evanso 64:e9dfc35a1738 192 // Define variables
evanso 64:e9dfc35a1738 193 spawn_time_multipler_ = 1;
evanso 64:e9dfc35a1738 194 alien_number_ = 5;
evanso 64:e9dfc35a1738 195 spawn_alien_counter_ = 0;
evanso 64:e9dfc35a1738 196 spaceship_lives_ = 3;
evanso 64:e9dfc35a1738 197 reset_map_counter_ = 0;
evanso 64:e9dfc35a1738 198 smart_bomb_counter_ = 4;
evanso 64:e9dfc35a1738 199 create_people();
evanso 64:e9dfc35a1738 200 points_ = 0;
evanso 64:e9dfc35a1738 201 smart_bomb_timer_ = 0;
evanso 64:e9dfc35a1738 202 bullet_timer_ = 0;
evanso 64:e9dfc35a1738 203 lcd_frame_time_flag_ = 0;
evanso 68:bb1650c657ef 204 paused_counter_ = 25;
evanso 64:e9dfc35a1738 205
evanso 82:3211b31e9421 206 // Flags for screen control
evanso 64:e9dfc35a1738 207 exit_flag_ = false;
evanso 64:e9dfc35a1738 208 run_save_a_game_flag_ = false;
evanso 64:e9dfc35a1738 209 spaceship_destroyed_ = false;
evanso 85:87bc28b151d8 210 saved.set_error(false);
evanso 85:87bc28b151d8 211 paused_button_pressed_ = false;
evanso 64:e9dfc35a1738 212 }
evanso 64:e9dfc35a1738 213
evanso 13:12276eed13ac 214 void GameEngine::gameplay_loop() {
evanso 82:3211b31e9421 215 // Clear screen and set contrast
evanso 13:12276eed13ac 216 lcd.setContrast(pad.read_pot1());
evanso 8:dd1037c5435b 217 lcd.clear();
evanso 11:ab578a151f67 218
evanso 85:87bc28b151d8 219 // Creates aliens and people
evanso 41:5959256f4aab 220 spawn_aliens();
evanso 41:5959256f4aab 221 spawn_people();
evanso 41:5959256f4aab 222
evanso 85:87bc28b151d8 223 // If spaceship is destroyed stop joystick input, don’t draw spaceship sprite
evanso 71:bcbac2cfe005 224 spaceship_not_detroyed();
evanso 41:5959256f4aab 225
evanso 41:5959256f4aab 226 // Draws objects
evanso 41:5959256f4aab 227 map.draw_map(lcd, d_);
evanso 41:5959256f4aab 228 draw_aliens();
evanso 41:5959256f4aab 229 draw_bullets();
evanso 41:5959256f4aab 230 draw_explosions();
evanso 41:5959256f4aab 231 draw_people();
evanso 45:fc3238cd28c6 232 hud.draw_HUD(lcd, spaceship_lives_, points_, smart_bomb_counter_);
evanso 41:5959256f4aab 233 spaceship_lives_leds();
evanso 41:5959256f4aab 234
evanso 41:5959256f4aab 235 reset_map_timer();
evanso 30:814674b189f0 236
evanso 82:3211b31e9421 237 // Refresh's screen
evanso 18:11068b98e261 238 lcd.refresh();
evanso 13:12276eed13ac 239 }
evanso 13:12276eed13ac 240
evanso 82:3211b31e9421 241 void GameEngine::spaceship_not_detroyed() {
evanso 82:3211b31e9421 242 if (!spaceship_destroyed_) {
evanso 71:bcbac2cfe005 243
evanso 85:87bc28b151d8 244 // Changes the control method depending what’s selected in the setting
evanso 84:f61c85a5f13a 245 if (setting.get_control_method() == joy ) {
evanso 71:bcbac2cfe005 246 read_joystick_direction();
evanso 71:bcbac2cfe005 247 }else {
evanso 71:bcbac2cfe005 248 read_accelerometer_direction(accelerometer.get_roll_angle(),
evanso 71:bcbac2cfe005 249 accelerometer.get_pitch_angle());
evanso 71:bcbac2cfe005 250 }
evanso 71:bcbac2cfe005 251
evanso 82:3211b31e9421 252 // Stops movement of spaceship and map after destroyed
evanso 71:bcbac2cfe005 253 spaceship.movement(d_);
evanso 71:bcbac2cfe005 254 spaceship.draw(lcd);
evanso 71:bcbac2cfe005 255 create_weapons_bullets();
evanso 71:bcbac2cfe005 256 create_weapons_smart_bomb();
evanso 71:bcbac2cfe005 257 }
evanso 71:bcbac2cfe005 258 }
evanso 71:bcbac2cfe005 259
evanso 82:3211b31e9421 260 void GameEngine::draw_game_over_screen() {
evanso 82:3211b31e9421 261 // Draws game over screen then back to menu
evanso 76:6daba3002424 262 lcd.clear();
evanso 76:6daba3002424 263 lcd.printString("Game Over",15,0);
evanso 76:6daba3002424 264
evanso 82:3211b31e9421 265 // Draws score/highscore part of screen
evanso 76:6daba3002424 266 char buffer[11];
evanso 76:6daba3002424 267 sprintf(buffer,"Score = %d",points_);
evanso 79:66bcf8fa2d2d 268 lcd.printString(buffer,12,2);
evanso 77:2ee9d1f9e282 269 h_score.set_error(false);
evanso 76:6daba3002424 270
evanso 82:3211b31e9421 271 // Prints new high score if a high score and no error
evanso 84:f61c85a5f13a 272 if (calculate_new_score()&& !h_score.get_error()) {
evanso 76:6daba3002424 273 lcd.printString("NEW HIGH SCORE",0,4);
evanso 76:6daba3002424 274
evanso 84:f61c85a5f13a 275 if (music_fx_ == music_on) {
evanso 76:6daba3002424 276 pad.play_melody(61, take_on_me, take_on_me_note_time, 140, false);
evanso 76:6daba3002424 277 }
evanso 76:6daba3002424 278
evanso 84:f61c85a5f13a 279 }else if (music_fx_ == music_on) {
evanso 74:6827b43c689d 280 pad.play_melody(23, god_farther, god_farther_note_time, 80, false);
evanso 74:6827b43c689d 281 }
evanso 76:6daba3002424 282
evanso 64:e9dfc35a1738 283 lcd.refresh();
evanso 72:e7492591307e 284 wait(6);
evanso 64:e9dfc35a1738 285 current_menu_part_ = main_menu;
evanso 62:f0c86a854a9e 286 }
evanso 62:f0c86a854a9e 287
evanso 82:3211b31e9421 288 void GameEngine::run_paused_game() {
evanso 82:3211b31e9421 289 // Lunch save a game screen
evanso 82:3211b31e9421 290 if (pad.B_pressed()||run_save_a_game_flag_) {
evanso 64:e9dfc35a1738 291 run_save_a_game_flag_ = true;
evanso 64:e9dfc35a1738 292 run_save_a_game();
evanso 64:e9dfc35a1738 293
evanso 82:3211b31e9421 294 // Draw pause screen
evanso 62:f0c86a854a9e 295 }else{
evanso 62:f0c86a854a9e 296 draw_pause_screen();
evanso 62:f0c86a854a9e 297 }
evanso 64:e9dfc35a1738 298
evanso 82:3211b31e9421 299 // Exit to main menu
evanso 82:3211b31e9421 300 if (pad.A_pressed()||saved.get_error()) {
evanso 56:663d0546c235 301 current_menu_part_ = main_menu;
evanso 74:6827b43c689d 302 play_music();
evanso 56:663d0546c235 303 exit_flag_ = true;
evanso 76:6daba3002424 304 saved.set_error(false);
evanso 86:eecd168c3a23 305 wait(0.037);
evanso 56:663d0546c235 306 }
evanso 56:663d0546c235 307 }
evanso 56:663d0546c235 308
evanso 82:3211b31e9421 309 void GameEngine::draw_pause_screen() {
evanso 82:3211b31e9421 310 // Clear screen and set contrast
evanso 56:663d0546c235 311 lcd.setContrast(pad.read_pot1());
evanso 56:663d0546c235 312 lcd.clear();
evanso 56:663d0546c235 313
evanso 82:3211b31e9421 314 // Draw strings
evanso 56:663d0546c235 315 lcd.printString("Paused!",24,0);
evanso 69:753ba27325ce 316 lcd.printString("Exit(A)",24,3);
evanso 69:753ba27325ce 317 lcd.printString("Save&Exit(B)",6,4);
evanso 56:663d0546c235 318
evanso 82:3211b31e9421 319 // Refresh's screen
evanso 56:663d0546c235 320 lcd.refresh();
evanso 56:663d0546c235 321 }
evanso 56:663d0546c235 322
evanso 82:3211b31e9421 323 void GameEngine::run_save_a_game() {
evanso 85:87bc28b151d8 324 // Draw and interact with save a game screen
evanso 64:e9dfc35a1738 325 read_joystick_direction();
evanso 64:e9dfc35a1738 326 saved.saved_games_scroll(d_);
evanso 64:e9dfc35a1738 327 saved.save_game_screen(lcd);
evanso 64:e9dfc35a1738 328
evanso 82:3211b31e9421 329 // Save game to save file that is displayed
evanso 82:3211b31e9421 330 if (pad.A_pressed()) {
evanso 82:3211b31e9421 331 // Define struct data
evanso 64:e9dfc35a1738 332 SavedGamesData data;
evanso 64:e9dfc35a1738 333
evanso 82:3211b31e9421 334 // Set values in struct data and saves them selected file
evanso 64:e9dfc35a1738 335 data.score = points_;
evanso 64:e9dfc35a1738 336 data.lives = spaceship_lives_;
evanso 64:e9dfc35a1738 337 data.smart_bombs = smart_bomb_counter_;
evanso 64:e9dfc35a1738 338 data.alien_number = alien_number_;
evanso 64:e9dfc35a1738 339 saved.add_saved_data(sd, data, lcd);
evanso 64:e9dfc35a1738 340
evanso 86:eecd168c3a23 341 // If error go back to pause screen
evanso 86:eecd168c3a23 342 if (saved.get_error()) {
evanso 86:eecd168c3a23 343 run_save_a_game_flag_ = false;
evanso 86:eecd168c3a23 344 saved.set_error(false);
evanso 86:eecd168c3a23 345 }else{
evanso 82:3211b31e9421 346 // Exit to main menu
evanso 64:e9dfc35a1738 347 current_menu_part_ = main_menu;
evanso 64:e9dfc35a1738 348 exit_flag_ = true;
evanso 86:eecd168c3a23 349 }
evanso 64:e9dfc35a1738 350 }
evanso 64:e9dfc35a1738 351 }
evanso 64:e9dfc35a1738 352
evanso 64:e9dfc35a1738 353
evanso 64:e9dfc35a1738 354
evanso 64:e9dfc35a1738 355
evanso 64:e9dfc35a1738 356 // Menu Setting ----------------------------------------------------------------
evanso 64:e9dfc35a1738 357
evanso 82:3211b31e9421 358 void GameEngine::run_settings() {
evanso 69:753ba27325ce 359 lcd.clear();
evanso 69:753ba27325ce 360 lcd.setContrast(pad.read_pot1());
evanso 69:753ba27325ce 361
evanso 69:753ba27325ce 362 // Scrolls, draws and changes different parts
evanso 69:753ba27325ce 363 read_joystick_direction();
evanso 69:753ba27325ce 364 setting.settings_scroll(d_);
evanso 69:753ba27325ce 365 setting.display_settings_screen(lcd, pad.read_pot1());
evanso 69:753ba27325ce 366 setting.change_setting(pad.A_pressed());
evanso 74:6827b43c689d 367
evanso 85:87bc28b151d8 368 // Stops music immediately changed
evanso 74:6827b43c689d 369 music_fx_ = setting.get_music_method();
evanso 85:87bc28b151d8 370 if (music_fx_ == music_off){
evanso 85:87bc28b151d8 371 stop_music();
evanso 86:eecd168c3a23 372 music_flag_ = false;
evanso 86:eecd168c3a23 373 }
evanso 86:eecd168c3a23 374 if (music_fx_ == music_on && !music_flag_ ){
evanso 86:eecd168c3a23 375 play_music();
evanso 86:eecd168c3a23 376 music_flag_ = true;
evanso 85:87bc28b151d8 377 }
evanso 82:3211b31e9421 378 // Go back to main menu if b
evanso 82:3211b31e9421 379 if (pad.B_pressed()) {
evanso 69:753ba27325ce 380 current_menu_part_ = main_menu;
evanso 69:753ba27325ce 381 }
evanso 69:753ba27325ce 382
evanso 69:753ba27325ce 383 lcd.refresh();
evanso 57:d4ce42c24561 384 }
evanso 57:d4ce42c24561 385
evanso 64:e9dfc35a1738 386
evanso 64:e9dfc35a1738 387
evanso 64:e9dfc35a1738 388 // Menu Saved Games ------------------------------------------------------------
evanso 64:e9dfc35a1738 389
evanso 82:3211b31e9421 390 void GameEngine::run_saved_games() {
evanso 64:e9dfc35a1738 391 // Draws and interact with save screen
evanso 64:e9dfc35a1738 392 read_joystick_direction();
evanso 64:e9dfc35a1738 393 saved.saved_games_scroll(d_);
evanso 64:e9dfc35a1738 394 saved.display_saved_games(lcd);
evanso 64:e9dfc35a1738 395
evanso 82:3211b31e9421 396 // Go back to main menu
evanso 82:3211b31e9421 397 if (pad.B_pressed()) {
evanso 64:e9dfc35a1738 398 current_menu_part_ = main_menu;
evanso 64:e9dfc35a1738 399 }
evanso 64:e9dfc35a1738 400
evanso 84:f61c85a5f13a 401 // Press A to load save, if no file press go back to main menu
evanso 82:3211b31e9421 402 if (pad.A_pressed()) {
evanso 64:e9dfc35a1738 403 wait(0.035);
evanso 64:e9dfc35a1738 404 saved_games_overide_init();
evanso 84:f61c85a5f13a 405 if (saved.get_error()) {
evanso 64:e9dfc35a1738 406 saved.set_error(false);
evanso 64:e9dfc35a1738 407 current_menu_part_ = main_menu;
evanso 64:e9dfc35a1738 408 }else{
evanso 64:e9dfc35a1738 409 current_menu_part_ = play;
evanso 64:e9dfc35a1738 410 }
evanso 64:e9dfc35a1738 411 }
evanso 64:e9dfc35a1738 412 }
evanso 64:e9dfc35a1738 413
evanso 82:3211b31e9421 414 void GameEngine::saved_games_overide_init() {
evanso 64:e9dfc35a1738 415 play_init();
evanso 64:e9dfc35a1738 416
evanso 85:87bc28b151d8 417 // Creates data object add sett it values to data saved in the file
evanso 64:e9dfc35a1738 418 SavedGamesData displayed_game;
evanso 64:e9dfc35a1738 419 displayed_game = saved.read_saved_data(sd, lcd);
evanso 64:e9dfc35a1738 420
evanso 82:3211b31e9421 421 // Set the variables to value in the displayed saved struct
evanso 64:e9dfc35a1738 422 points_ = displayed_game.score;
evanso 64:e9dfc35a1738 423 spaceship_lives_ = displayed_game.lives;
evanso 64:e9dfc35a1738 424 smart_bomb_counter_= displayed_game.smart_bombs;
evanso 64:e9dfc35a1738 425 alien_number_ = displayed_game.alien_number;
evanso 64:e9dfc35a1738 426 }
evanso 64:e9dfc35a1738 427
evanso 80:870bc6b4bf08 428
evanso 80:870bc6b4bf08 429
evanso 76:6daba3002424 430 // Menu High score -------------------------------------------------------------
evanso 64:e9dfc35a1738 431
evanso 82:3211b31e9421 432 void GameEngine::run_highscore() {
evanso 77:2ee9d1f9e282 433 lcd.clear();
evanso 77:2ee9d1f9e282 434 lcd.printString("High Scores",9,0);
evanso 77:2ee9d1f9e282 435 lcd.printString("Back(B)",21,5);
evanso 76:6daba3002424 436
evanso 85:87bc28b151d8 437 // Sets error to false as may of become true from previous error
evanso 77:2ee9d1f9e282 438 h_score.set_error(false);
evanso 77:2ee9d1f9e282 439
evanso 82:3211b31e9421 440 // Draws score/highscore part of screen
evanso 77:2ee9d1f9e282 441 char buffer[11];
evanso 77:2ee9d1f9e282 442 sprintf(buffer,"Score = %d",h_score.read_high_score(sd));
evanso 77:2ee9d1f9e282 443 lcd.printString(buffer,9,3);
evanso 77:2ee9d1f9e282 444
evanso 77:2ee9d1f9e282 445 // If error reading high score just say no high score or sd card
evanso 82:3211b31e9421 446 if (h_score.get_error()) {
evanso 77:2ee9d1f9e282 447 h_score.no_high_scores(lcd);
evanso 77:2ee9d1f9e282 448 wait(3);
evanso 77:2ee9d1f9e282 449 current_menu_part_ = main_menu;
evanso 77:2ee9d1f9e282 450 }
evanso 77:2ee9d1f9e282 451
evanso 82:3211b31e9421 452 // Go back to main menu when b pressed
evanso 82:3211b31e9421 453 if (pad.B_pressed()) {
evanso 77:2ee9d1f9e282 454 current_menu_part_ = main_menu;
evanso 77:2ee9d1f9e282 455 }
evanso 77:2ee9d1f9e282 456
evanso 77:2ee9d1f9e282 457 lcd.refresh();
evanso 76:6daba3002424 458 }
evanso 76:6daba3002424 459
evanso 82:3211b31e9421 460 bool GameEngine::calculate_new_score() {
evanso 76:6daba3002424 461 bool new_high_score = false;
evanso 76:6daba3002424 462
evanso 82:3211b31e9421 463 // Gets old high score and return true if current score is greater
evanso 76:6daba3002424 464 int saved_high_score = h_score.read_high_score(sd);
evanso 82:3211b31e9421 465 if (points_ > saved_high_score) {
evanso 76:6daba3002424 466 new_high_score = true;
evanso 77:2ee9d1f9e282 467 h_score.save_new_high_score(sd, lcd, points_);
evanso 76:6daba3002424 468 }
evanso 76:6daba3002424 469 return new_high_score;
evanso 85:87bc28b151d8 470 }