James Cummins / Mbed 2 deprecated el17jnc

Dependencies:   mbed

Committer:
JamesCummins
Date:
Sun Apr 21 13:20:12 2019 +0000
Revision:
25:b52aa23df120
Parent:
24:c6415cc74b17
Child:
26:0dc10374546f
Started trying to create SD files, and moved game mode functions into main.cpp to make classes more readable

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 22:4e305ff8a050 15 #include "OptionsEngine.h"
JamesCummins 24:c6415cc74b17 16 #include "SDFileSystem.h"
JamesCummins 13:e5a36fbd48ae 17 #define RADIUS 3
JamesCummins 0:7c96d84b673e 18
JamesCummins 11:2cf0d4ce8677 19
JamesCummins 11:2cf0d4ce8677 20 //Objects
JamesCummins 6:952ac12c7f00 21 Gamepad gamepad;
JamesCummins 0:7c96d84b673e 22 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
JamesCummins 20:4a39a1a2be51 23 BrickBreakerEngine brick;
JamesCummins 22:4e305ff8a050 24 OptionsEngine opt;
JamesCummins 11:2cf0d4ce8677 25 AnalogIn randnoise(PTB0);
JamesCummins 12:9982239b7906 26 FXOS8700CQ accelerometer(I2C_SDA,I2C_SCL);
JamesCummins 24:c6415cc74b17 27 Ball ball;
JamesCummins 25:b52aa23df120 28 Pause pause;
JamesCummins 24:c6415cc74b17 29 SDFileSystem sd(PTE3,PTE1,PTE2,PTE4,"sd");
JamesCummins 11:2cf0d4ce8677 30
JamesCummins 20:4a39a1a2be51 31 //Enumeric class and struct for game mode selection menu
JamesCummins 20:4a39a1a2be51 32 enum StartOption{
JamesCummins 20:4a39a1a2be51 33 CLASSIC,
JamesCummins 20:4a39a1a2be51 34 BRICKBREAKER,
JamesCummins 20:4a39a1a2be51 35 OPTIONS
JamesCummins 20:4a39a1a2be51 36 };
JamesCummins 20:4a39a1a2be51 37
JamesCummins 20:4a39a1a2be51 38 struct StartSelection{
JamesCummins 20:4a39a1a2be51 39 int output;
JamesCummins 20:4a39a1a2be51 40 StartOption next_state[3];
JamesCummins 20:4a39a1a2be51 41 };
JamesCummins 20:4a39a1a2be51 42
JamesCummins 11:2cf0d4ce8677 43 //Methods
JamesCummins 7:6eb9cade57ab 44 void startscreen();
JamesCummins 17:5104ecef5bd0 45 StartOption menu();
JamesCummins 12:9982239b7906 46 void init();
JamesCummins 15:1564bd6b713d 47 void print_start_menu(int output);
JamesCummins 25:b52aa23df120 48 void brickbreaker_mode();
JamesCummins 25:b52aa23df120 49 void options_menu();
JamesCummins 8:4e306b16a941 50
JamesCummins 11:2cf0d4ce8677 51
JamesCummins 17:5104ecef5bd0 52 ////////////////Main Function/////////////////
JamesCummins 8:4e306b16a941 53
JamesCummins 25:b52aa23df120 54 int fps = 30;
JamesCummins 8:4e306b16a941 55
JamesCummins 0:7c96d84b673e 56 int main(){
JamesCummins 10:40c77d69e83c 57 init();
JamesCummins 7:6eb9cade57ab 58 startscreen();
JamesCummins 16:e846864778c4 59 while(1){
JamesCummins 17:5104ecef5bd0 60 StartOption choice_selected = menu();
JamesCummins 20:4a39a1a2be51 61 if(choice_selected == CLASSIC){ /*engine.classic_mode(accelerometer, gamepad, lcd, fps);*/}
JamesCummins 25:b52aa23df120 62 if(choice_selected == BRICKBREAKER){ brickbreaker_mode();}
JamesCummins 25:b52aa23df120 63 if(choice_selected == OPTIONS){ options_menu();}
JamesCummins 16:e846864778c4 64 }
JamesCummins 0:7c96d84b673e 65 }
JamesCummins 8:4e306b16a941 66
JamesCummins 8:4e306b16a941 67
JamesCummins 11:2cf0d4ce8677 68
JamesCummins 8:4e306b16a941 69 //////////////Start up functions///////////////////
JamesCummins 11:2cf0d4ce8677 70
JamesCummins 10:40c77d69e83c 71 void init(){
JamesCummins 10:40c77d69e83c 72 gamepad.init();
JamesCummins 10:40c77d69e83c 73 lcd.init();
JamesCummins 10:40c77d69e83c 74 lcd.setContrast(0.55);
JamesCummins 23:61fa82f76808 75 brick.init(RADIUS, ball);
JamesCummins 22:4e305ff8a050 76 opt.init();
JamesCummins 25:b52aa23df120 77 pause.init();
JamesCummins 18:08046153e6ad 78 accelerometer.init();
JamesCummins 24:c6415cc74b17 79 sd.disk_initialize();
JamesCummins 10:40c77d69e83c 80 wait(1);
JamesCummins 10:40c77d69e83c 81 }
JamesCummins 0:7c96d84b673e 82
JamesCummins 7:6eb9cade57ab 83 void startscreen() {
JamesCummins 1:99d524f81566 84 lcd.clear();
JamesCummins 5:7e8f5fad7b6b 85 char gamename[] = {'L', 'A', 'B', 'Y', 'R', 'I', 'N', 'T', 'H', ' ', ' ', '\0'};
JamesCummins 3:f2e5ffd2b94c 86 int i = 0;
JamesCummins 5:7e8f5fad7b6b 87 for(int a = 0; a < 35; a++){
JamesCummins 4:2f01b85e57f9 88 lcd.clear();
JamesCummins 4:2f01b85e57f9 89 lcd.drawCircle(24+2*a, 21, 3, FILL_BLACK);
JamesCummins 4:2f01b85e57f9 90 for (i = 0; i < a/3; i++) {
JamesCummins 4:2f01b85e57f9 91 lcd.printChar(gamename[i], 15+i*6, 2);
JamesCummins 4:2f01b85e57f9 92 lcd.refresh();
JamesCummins 4:2f01b85e57f9 93 }
JamesCummins 15:1564bd6b713d 94 wait_ms(50);
JamesCummins 4:2f01b85e57f9 95 }
JamesCummins 5:7e8f5fad7b6b 96 lcd.printString("Press start", 9, 4);
JamesCummins 5:7e8f5fad7b6b 97 lcd.printString("to play >", 15, 5);
JamesCummins 6:952ac12c7f00 98 lcd.refresh();
JamesCummins 6:952ac12c7f00 99 bool advance = false;
JamesCummins 6:952ac12c7f00 100 while (!advance){
JamesCummins 6:952ac12c7f00 101 if (gamepad.check_event(gamepad.START_PRESSED)){
JamesCummins 6:952ac12c7f00 102 lcd.clear();
JamesCummins 6:952ac12c7f00 103 lcd.refresh();
JamesCummins 6:952ac12c7f00 104 advance = true;
JamesCummins 6:952ac12c7f00 105 }
JamesCummins 6:952ac12c7f00 106 else { advance = false; }
JamesCummins 6:952ac12c7f00 107 }
JamesCummins 0:7c96d84b673e 108 }
JamesCummins 7:6eb9cade57ab 109
JamesCummins 17:5104ecef5bd0 110 StartOption menu(){
JamesCummins 15:1564bd6b713d 111 StartSelection fsm[3] = {
JamesCummins 14:108052b6222b 112 {0,{OPTIONS,BRICKBREAKER,CLASSIC}},
JamesCummins 14:108052b6222b 113 {2,{CLASSIC,OPTIONS,BRICKBREAKER}},
JamesCummins 14:108052b6222b 114 {4,{BRICKBREAKER,CLASSIC,OPTIONS}}
JamesCummins 7:6eb9cade57ab 115 };
JamesCummins 14:108052b6222b 116 StartOption state = CLASSIC; //start with the arrow on the top option
JamesCummins 7:6eb9cade57ab 117 int next = 2; //next_state = 2 so that by default it doesn't change arrow position
JamesCummins 22:4e305ff8a050 118 while(!(gamepad.check_event(gamepad.A_PRESSED))){ //select choice by pushing joystick to the right
JamesCummins 7:6eb9cade57ab 119 state = fsm[state].next_state[next];
JamesCummins 7:6eb9cade57ab 120 lcd.clear();
JamesCummins 7:6eb9cade57ab 121 if(gamepad.get_direction() == N){ next = 0;}
JamesCummins 7:6eb9cade57ab 122 else if(gamepad.get_direction() == S){ next = 1;}
JamesCummins 7:6eb9cade57ab 123 else {next = 2;}
JamesCummins 15:1564bd6b713d 124 print_start_menu(fsm[state].output);
JamesCummins 7:6eb9cade57ab 125 lcd.refresh();
JamesCummins 7:6eb9cade57ab 126 wait(0.25);
JamesCummins 7:6eb9cade57ab 127 }
JamesCummins 7:6eb9cade57ab 128 lcd.clear();
JamesCummins 7:6eb9cade57ab 129 lcd.refresh();
JamesCummins 7:6eb9cade57ab 130 return state;
JamesCummins 15:1564bd6b713d 131 }
JamesCummins 15:1564bd6b713d 132
JamesCummins 15:1564bd6b713d 133 void print_start_menu(int output){
JamesCummins 15:1564bd6b713d 134 lcd.printString(">", 0, output);
JamesCummins 15:1564bd6b713d 135 lcd.printString("Classic", 36, 0);
JamesCummins 15:1564bd6b713d 136 lcd.printString("BrickBreak", 18, 2);
JamesCummins 15:1564bd6b713d 137 lcd.printString("Options", 36, 4);
JamesCummins 22:4e305ff8a050 138 lcd.printString("(A = Select)", 12, 5);
JamesCummins 25:b52aa23df120 139 }
JamesCummins 25:b52aa23df120 140
JamesCummins 25:b52aa23df120 141 void brickbreaker_mode(){
JamesCummins 25:b52aa23df120 142 for(int i = 0; i < 45*fps; i++){
JamesCummins 25:b52aa23df120 143 if(i == 1){ brick.set_score(0); } //reset score when game restarts
JamesCummins 25:b52aa23df120 144 ball.read_input(accelerometer);
JamesCummins 25:b52aa23df120 145 ball.update();
JamesCummins 25:b52aa23df120 146 /*Vector2D position = _ball.get_position();
JamesCummins 25:b52aa23df120 147 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 148 brick.check_square_collision(randnoise, ball);
JamesCummins 25:b52aa23df120 149 lcd.clear();
JamesCummins 25:b52aa23df120 150 brick.brickbreaker_draw(lcd, ball);
JamesCummins 25:b52aa23df120 151 lcd.refresh();
JamesCummins 25:b52aa23df120 152 wait_ms(1000/fps);
JamesCummins 25:b52aa23df120 153 if(gamepad.check_event(gamepad.BACK_PRESSED)){
JamesCummins 25:b52aa23df120 154 int choice = pause.pause_menu(gamepad, lcd, fps, i, BRICKBREAKER_MODE);
JamesCummins 25:b52aa23df120 155 i = choice;
JamesCummins 25:b52aa23df120 156 }
JamesCummins 25:b52aa23df120 157 }
JamesCummins 25:b52aa23df120 158 brick.check_high_score(sd);
JamesCummins 25:b52aa23df120 159 }
JamesCummins 25:b52aa23df120 160
JamesCummins 25:b52aa23df120 161 void options_menu(){
JamesCummins 25:b52aa23df120 162 Option choice = BRIGHTNESS;
JamesCummins 25:b52aa23df120 163 while(!(gamepad.check_event(gamepad.A_PRESSED))){
JamesCummins 25:b52aa23df120 164 lcd.clear();
JamesCummins 25:b52aa23df120 165 opt.display_options(lcd);
JamesCummins 25:b52aa23df120 166 choice = opt.option_selection(gamepad, lcd);
JamesCummins 25:b52aa23df120 167 lcd.refresh();
JamesCummins 25:b52aa23df120 168 wait(0.2);
JamesCummins 25:b52aa23df120 169 }
JamesCummins 25:b52aa23df120 170 if(choice == BRIGHTNESS){ opt.change_brightness(gamepad, lcd); }
JamesCummins 25:b52aa23df120 171 if(choice == BALL_SPEED){ opt.change_ball_speed(gamepad, lcd, ball); }
JamesCummins 25:b52aa23df120 172 if(choice == HIGH_SCORES){ opt.view_high_scores(gamepad, lcd, sd); }
JamesCummins 25:b52aa23df120 173 }