James Cummins / Mbed 2 deprecated el17jnc

Dependencies:   mbed

Committer:
JamesCummins
Date:
Sun Apr 28 10:20:52 2019 +0000
Revision:
32:eff573ad8e42
Parent:
31:c95f1b1d6423
Child:
33:c2dbad3dd805
Classic mode finished and working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JamesCummins 0:7c96d84b673e 1 /*
JamesCummins 0:7c96d84b673e 2 ELEC2645 Embedded Systems Project
JamesCummins 0:7c96d84b673e 3 School of Electronic & Electrical Engineering
JamesCummins 0:7c96d84b673e 4 University of Leeds
JamesCummins 0:7c96d84b673e 5 Name: James Nathan Cummins
JamesCummins 0:7c96d84b673e 6 Username: el17jnc
JamesCummins 0:7c96d84b673e 7 Student ID Number: 201096364
JamesCummins 0:7c96d84b673e 8 Date: 22/03/19
JamesCummins 0:7c96d84b673e 9 */
JamesCummins 0:7c96d84b673e 10
JamesCummins 0:7c96d84b673e 11 #include "Gamepad.h"
JamesCummins 0:7c96d84b673e 12 #include "mbed.h"
JamesCummins 1:99d524f81566 13 #include "N5110.h"
JamesCummins 20:4a39a1a2be51 14 #include "BrickBreakerEngine.h"
JamesCummins 29:42651f87522b 15 #include "ClassicEngine.h"
JamesCummins 22:4e305ff8a050 16 #include "OptionsEngine.h"
JamesCummins 24:c6415cc74b17 17 #include "SDFileSystem.h"
JamesCummins 13:e5a36fbd48ae 18 #define RADIUS 3
JamesCummins 0:7c96d84b673e 19
JamesCummins 11:2cf0d4ce8677 20
JamesCummins 11:2cf0d4ce8677 21 //Objects
JamesCummins 6:952ac12c7f00 22 Gamepad gamepad;
JamesCummins 0:7c96d84b673e 23 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
JamesCummins 29:42651f87522b 24 ClassicEngine classic;
JamesCummins 20:4a39a1a2be51 25 BrickBreakerEngine brick;
JamesCummins 22:4e305ff8a050 26 OptionsEngine opt;
JamesCummins 29:42651f87522b 27 Map map;
JamesCummins 11:2cf0d4ce8677 28 AnalogIn randnoise(PTB0);
JamesCummins 12:9982239b7906 29 FXOS8700CQ accelerometer(I2C_SDA,I2C_SCL);
JamesCummins 24:c6415cc74b17 30 Ball ball;
JamesCummins 25:b52aa23df120 31 Pause pause;
JamesCummins 24:c6415cc74b17 32 SDFileSystem sd(PTE3,PTE1,PTE2,PTE4,"sd");
JamesCummins 11:2cf0d4ce8677 33
JamesCummins 20:4a39a1a2be51 34 //Enumeric class and struct for game mode selection menu
JamesCummins 20:4a39a1a2be51 35 enum StartOption{
JamesCummins 20:4a39a1a2be51 36 CLASSIC,
JamesCummins 20:4a39a1a2be51 37 BRICKBREAKER,
JamesCummins 20:4a39a1a2be51 38 OPTIONS
JamesCummins 20:4a39a1a2be51 39 };
JamesCummins 20:4a39a1a2be51 40
JamesCummins 20:4a39a1a2be51 41 struct StartSelection{
JamesCummins 20:4a39a1a2be51 42 int output;
JamesCummins 20:4a39a1a2be51 43 StartOption next_state[3];
JamesCummins 20:4a39a1a2be51 44 };
JamesCummins 20:4a39a1a2be51 45
JamesCummins 11:2cf0d4ce8677 46 //Methods
JamesCummins 7:6eb9cade57ab 47 void startscreen();
JamesCummins 17:5104ecef5bd0 48 StartOption menu();
JamesCummins 12:9982239b7906 49 void init();
JamesCummins 15:1564bd6b713d 50 void print_start_menu(int output);
JamesCummins 29:42651f87522b 51 void classic_mode();
JamesCummins 25:b52aa23df120 52 void brickbreaker_mode();
JamesCummins 25:b52aa23df120 53 void options_menu();
JamesCummins 8:4e306b16a941 54
JamesCummins 11:2cf0d4ce8677 55
JamesCummins 17:5104ecef5bd0 56 ////////////////Main Function/////////////////
JamesCummins 8:4e306b16a941 57
JamesCummins 29:42651f87522b 58 int fps = 16; //declared globally so it doesn't have to be passed to
JamesCummins 29:42651f87522b 59 //the different game mode functions
JamesCummins 0:7c96d84b673e 60 int main(){
JamesCummins 10:40c77d69e83c 61 init();
JamesCummins 7:6eb9cade57ab 62 startscreen();
JamesCummins 16:e846864778c4 63 while(1){
JamesCummins 17:5104ecef5bd0 64 StartOption choice_selected = menu();
JamesCummins 29:42651f87522b 65 if(choice_selected == CLASSIC){ classic_mode();}
JamesCummins 25:b52aa23df120 66 if(choice_selected == BRICKBREAKER){ brickbreaker_mode();}
JamesCummins 25:b52aa23df120 67 if(choice_selected == OPTIONS){ options_menu();}
JamesCummins 16:e846864778c4 68 }
JamesCummins 0:7c96d84b673e 69 }
JamesCummins 8:4e306b16a941 70
JamesCummins 8:4e306b16a941 71
JamesCummins 11:2cf0d4ce8677 72
JamesCummins 8:4e306b16a941 73 //////////////Start up functions///////////////////
JamesCummins 11:2cf0d4ce8677 74
JamesCummins 10:40c77d69e83c 75 void init(){
JamesCummins 10:40c77d69e83c 76 gamepad.init();
JamesCummins 10:40c77d69e83c 77 lcd.init();
JamesCummins 10:40c77d69e83c 78 lcd.setContrast(0.55);
JamesCummins 31:c95f1b1d6423 79 classic.init(ball, map);
JamesCummins 23:61fa82f76808 80 brick.init(RADIUS, ball);
JamesCummins 22:4e305ff8a050 81 opt.init();
JamesCummins 29:42651f87522b 82 map.init();
JamesCummins 25:b52aa23df120 83 pause.init();
JamesCummins 18:08046153e6ad 84 accelerometer.init();
JamesCummins 24:c6415cc74b17 85 sd.disk_initialize();
JamesCummins 10:40c77d69e83c 86 wait(1);
JamesCummins 10:40c77d69e83c 87 }
JamesCummins 0:7c96d84b673e 88
JamesCummins 7:6eb9cade57ab 89 void startscreen() {
JamesCummins 1:99d524f81566 90 lcd.clear();
JamesCummins 5:7e8f5fad7b6b 91 char gamename[] = {'L', 'A', 'B', 'Y', 'R', 'I', 'N', 'T', 'H', ' ', ' ', '\0'};
JamesCummins 3:f2e5ffd2b94c 92 int i = 0;
JamesCummins 5:7e8f5fad7b6b 93 for(int a = 0; a < 35; a++){
JamesCummins 4:2f01b85e57f9 94 lcd.clear();
JamesCummins 4:2f01b85e57f9 95 lcd.drawCircle(24+2*a, 21, 3, FILL_BLACK);
JamesCummins 4:2f01b85e57f9 96 for (i = 0; i < a/3; i++) {
JamesCummins 4:2f01b85e57f9 97 lcd.printChar(gamename[i], 15+i*6, 2);
JamesCummins 4:2f01b85e57f9 98 lcd.refresh();
JamesCummins 4:2f01b85e57f9 99 }
JamesCummins 15:1564bd6b713d 100 wait_ms(50);
JamesCummins 4:2f01b85e57f9 101 }
JamesCummins 5:7e8f5fad7b6b 102 lcd.printString("Press start", 9, 4);
JamesCummins 5:7e8f5fad7b6b 103 lcd.printString("to play >", 15, 5);
JamesCummins 6:952ac12c7f00 104 lcd.refresh();
JamesCummins 6:952ac12c7f00 105 bool advance = false;
JamesCummins 6:952ac12c7f00 106 while (!advance){
JamesCummins 6:952ac12c7f00 107 if (gamepad.check_event(gamepad.START_PRESSED)){
JamesCummins 6:952ac12c7f00 108 lcd.clear();
JamesCummins 6:952ac12c7f00 109 lcd.refresh();
JamesCummins 6:952ac12c7f00 110 advance = true;
JamesCummins 6:952ac12c7f00 111 }
JamesCummins 6:952ac12c7f00 112 else { advance = false; }
JamesCummins 6:952ac12c7f00 113 }
JamesCummins 0:7c96d84b673e 114 }
JamesCummins 7:6eb9cade57ab 115
JamesCummins 17:5104ecef5bd0 116 StartOption menu(){
JamesCummins 15:1564bd6b713d 117 StartSelection fsm[3] = {
JamesCummins 14:108052b6222b 118 {0,{OPTIONS,BRICKBREAKER,CLASSIC}},
JamesCummins 14:108052b6222b 119 {2,{CLASSIC,OPTIONS,BRICKBREAKER}},
JamesCummins 14:108052b6222b 120 {4,{BRICKBREAKER,CLASSIC,OPTIONS}}
JamesCummins 7:6eb9cade57ab 121 };
JamesCummins 14:108052b6222b 122 StartOption state = CLASSIC; //start with the arrow on the top option
JamesCummins 7:6eb9cade57ab 123 int next = 2; //next_state = 2 so that by default it doesn't change arrow position
JamesCummins 22:4e305ff8a050 124 while(!(gamepad.check_event(gamepad.A_PRESSED))){ //select choice by pushing joystick to the right
JamesCummins 7:6eb9cade57ab 125 state = fsm[state].next_state[next];
JamesCummins 7:6eb9cade57ab 126 lcd.clear();
JamesCummins 7:6eb9cade57ab 127 if(gamepad.get_direction() == N){ next = 0;}
JamesCummins 7:6eb9cade57ab 128 else if(gamepad.get_direction() == S){ next = 1;}
JamesCummins 7:6eb9cade57ab 129 else {next = 2;}
JamesCummins 15:1564bd6b713d 130 print_start_menu(fsm[state].output);
JamesCummins 7:6eb9cade57ab 131 lcd.refresh();
JamesCummins 7:6eb9cade57ab 132 wait(0.25);
JamesCummins 7:6eb9cade57ab 133 }
JamesCummins 7:6eb9cade57ab 134 lcd.clear();
JamesCummins 7:6eb9cade57ab 135 lcd.refresh();
JamesCummins 7:6eb9cade57ab 136 return state;
JamesCummins 15:1564bd6b713d 137 }
JamesCummins 15:1564bd6b713d 138
JamesCummins 15:1564bd6b713d 139 void print_start_menu(int output){
JamesCummins 15:1564bd6b713d 140 lcd.printString(">", 0, output);
JamesCummins 15:1564bd6b713d 141 lcd.printString("Classic", 36, 0);
JamesCummins 15:1564bd6b713d 142 lcd.printString("BrickBreak", 18, 2);
JamesCummins 15:1564bd6b713d 143 lcd.printString("Options", 36, 4);
JamesCummins 22:4e305ff8a050 144 lcd.printString("(A = Select)", 12, 5);
JamesCummins 25:b52aa23df120 145 }
JamesCummins 25:b52aa23df120 146
JamesCummins 29:42651f87522b 147 //////////////////Game Mode Functions////////////////////////////////
JamesCummins 29:42651f87522b 148
JamesCummins 29:42651f87522b 149 void classic_mode(){
JamesCummins 29:42651f87522b 150 classic.init(ball, map);
JamesCummins 31:c95f1b1d6423 151 bool collision = false;
JamesCummins 31:c95f1b1d6423 152 while(!(collision)){
JamesCummins 32:eff573ad8e42 153 if(classic.finished()){ //check if the game has been completed
JamesCummins 31:c95f1b1d6423 154 classic.mode_complete(lcd, gamepad, fps);
JamesCummins 31:c95f1b1d6423 155 break;
JamesCummins 31:c95f1b1d6423 156 }
JamesCummins 32:eff573ad8e42 157 if(map.check_wall_collision(gamepad, ball)){ //end the game if collision with wall
JamesCummins 32:eff573ad8e42 158 collision = classic.mode_failed(lcd, gamepad, ball, map); //gives the option to restart the game (and stay in while loop) or quit
JamesCummins 31:c95f1b1d6423 159 if(!(collision)){ classic.init(ball, map); }
JamesCummins 31:c95f1b1d6423 160 }
JamesCummins 29:42651f87522b 161 classic.classic_update(ball, accelerometer, map);
JamesCummins 29:42651f87522b 162 lcd.clear();
JamesCummins 29:42651f87522b 163 classic.classic_draw(lcd, map, ball);
JamesCummins 29:42651f87522b 164 lcd.refresh();
JamesCummins 29:42651f87522b 165 wait(1/fps);
JamesCummins 32:eff573ad8e42 166 if(gamepad.check_event(gamepad.BACK_PRESSED)){ //pause menu
JamesCummins 29:42651f87522b 167 PauseOption choice = pause.pause_menu(gamepad, lcd, fps);
JamesCummins 32:eff573ad8e42 168 if(choice == RESUME){} //the different options must be processed
JamesCummins 32:eff573ad8e42 169 if(choice == RESTART){ classic.init(ball, map); } //in main.cpp as they have different
JamesCummins 32:eff573ad8e42 170 if(choice == QUIT){ break; } //return types so can't be passed into main
JamesCummins 29:42651f87522b 171 if(choice == HELP){ pause.classic_help(gamepad, lcd); }
JamesCummins 29:42651f87522b 172 }
JamesCummins 29:42651f87522b 173 }
JamesCummins 29:42651f87522b 174 }
JamesCummins 29:42651f87522b 175
JamesCummins 25:b52aa23df120 176 void brickbreaker_mode(){
JamesCummins 25:b52aa23df120 177 for(int i = 0; i < 45*fps; i++){
JamesCummins 25:b52aa23df120 178 if(i == 1){ brick.set_score(0); } //reset score when game restarts
JamesCummins 25:b52aa23df120 179 ball.read_input(accelerometer);
JamesCummins 25:b52aa23df120 180 ball.update();
JamesCummins 25:b52aa23df120 181 /*Vector2D position = _ball.get_position();
JamesCummins 25:b52aa23df120 182 printf("ball_x = %f | ball_y = %f\n", position.x, position.y); //note: running with tests causes the game to run slow and take ~2min30s*/
JamesCummins 25:b52aa23df120 183 brick.check_square_collision(randnoise, ball);
JamesCummins 25:b52aa23df120 184 lcd.clear();
JamesCummins 25:b52aa23df120 185 brick.brickbreaker_draw(lcd, ball);
JamesCummins 25:b52aa23df120 186 lcd.refresh();
JamesCummins 32:eff573ad8e42 187 brick.time_warning(gamepad, i, fps);
JamesCummins 25:b52aa23df120 188 wait_ms(1000/fps);
JamesCummins 25:b52aa23df120 189 if(gamepad.check_event(gamepad.BACK_PRESSED)){
JamesCummins 29:42651f87522b 190 PauseOption choice = pause.pause_menu(gamepad, lcd, fps);
JamesCummins 29:42651f87522b 191 i = pause.brickbreaker_action(choice, gamepad, lcd, i, fps); //returns which frame to jump to
JamesCummins 25:b52aa23df120 192 }
JamesCummins 25:b52aa23df120 193 }
JamesCummins 32:eff573ad8e42 194 brick.end(gamepad, lcd);
JamesCummins 26:0dc10374546f 195 brick.write_high_scores();
JamesCummins 25:b52aa23df120 196 }
JamesCummins 25:b52aa23df120 197
JamesCummins 25:b52aa23df120 198 void options_menu(){
JamesCummins 25:b52aa23df120 199 Option choice = BRIGHTNESS;
JamesCummins 25:b52aa23df120 200 while(!(gamepad.check_event(gamepad.A_PRESSED))){
JamesCummins 25:b52aa23df120 201 lcd.clear();
JamesCummins 25:b52aa23df120 202 opt.display_options(lcd);
JamesCummins 25:b52aa23df120 203 choice = opt.option_selection(gamepad, lcd);
JamesCummins 25:b52aa23df120 204 lcd.refresh();
JamesCummins 25:b52aa23df120 205 wait(0.2);
JamesCummins 25:b52aa23df120 206 }
JamesCummins 25:b52aa23df120 207 if(choice == BRIGHTNESS){ opt.change_brightness(gamepad, lcd); }
JamesCummins 25:b52aa23df120 208 if(choice == BALL_SPEED){ opt.change_ball_speed(gamepad, lcd, ball); }
JamesCummins 26:0dc10374546f 209 if(choice == HIGH_SCORES){ opt.view_high_scores(gamepad, lcd); }
JamesCummins 25:b52aa23df120 210 }
JamesCummins 29:42651f87522b 211
JamesCummins 29:42651f87522b 212