ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Committer:
el17cd
Date:
Fri Apr 05 13:54:34 2019 +0000
Revision:
30:91038c2afec7
Parent:
29:4a02f0bae202
Child:
31:e681177037ef
Added highscore saving to sd card

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17cd 15:8fbbdefbe720 1 #include "Game.h"
el17cd 30:91038c2afec7 2 #include "SDFileSystem.h"
el17cd 30:91038c2afec7 3 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
el17cd 19:ec4cb22accb0 4
el17cd 26:8a85aede976d 5 Serial pc(USBTX, USBRX); // tx, rx
el17cd 26:8a85aede976d 6
el17cd 15:8fbbdefbe720 7 Game::Game(){
el17cd 25:3995271e411c 8 noOfCubes = 25; //How many cubes are in the scene
el17cd 25:3995271e411c 9 homeSelection = 0; //default selection for the home screen
el17cd 15:8fbbdefbe720 10 gamepad.init();
el17cd 15:8fbbdefbe720 11 renderer.init();
el17cd 26:8a85aede976d 12 resetScene();
el17cd 30:91038c2afec7 13 help = -1; //Set help screen to inactive (-1)
el17cd 30:91038c2afec7 14 input.x = 0; //Set joystick input to 0
el17cd 30:91038c2afec7 15 input.bCooldown = input.yCooldown = input.aCooldown = false; //Allow buttons to be pressed
el17cd 30:91038c2afec7 16 deathMenuSelection = true; //Set death menu to highlight restart option
el17cd 30:91038c2afec7 17 //filePointer = fopen("/sd/topscore.txt", "w");
el17cd 30:91038c2afec7 18 //fprintf(filePointer, "%i", score);
el17cd 30:91038c2afec7 19 pc.printf("a");
el17cd 30:91038c2afec7 20 highScore = readHighScore();
el17cd 26:8a85aede976d 21 }
el17cd 26:8a85aede976d 22
el17cd 26:8a85aede976d 23 void Game::resetScene(){
el17cd 25:3995271e411c 24 for(int i = 0; i < noOfCubes; i++){ //Set initial position of all cubes
el17cd 29:4a02f0bae202 25 cubeArray[i].translate(rand()%250-125, 0, 10+ i*5); //Position will be based on random integers
el17cd 15:8fbbdefbe720 26 }
el17cd 15:8fbbdefbe720 27 }
el17cd 15:8fbbdefbe720 28
el17cd 30:91038c2afec7 29 int Game::readHighScore(){
el17cd 30:91038c2afec7 30 int highScore = 0;
el17cd 30:91038c2afec7 31 filePointer = fopen("/sd/el17cdHighScore.txt", "r");
el17cd 30:91038c2afec7 32
el17cd 29:4a02f0bae202 33 if (filePointer != NULL) {
el17cd 30:91038c2afec7 34 fscanf(filePointer, "%d", &highScore); //read integer from sd card file
el17cd 30:91038c2afec7 35 fclose(filePointer);
el17cd 29:4a02f0bae202 36 }
el17cd 30:91038c2afec7 37 return highScore;;
el17cd 29:4a02f0bae202 38 }
el17cd 29:4a02f0bae202 39
el17cd 29:4a02f0bae202 40 void Game::writeHighScore(int score){
el17cd 30:91038c2afec7 41 filePointer = fopen("/sd/el17cdHighScore.txt", "w");
el17cd 30:91038c2afec7 42
el17cd 29:4a02f0bae202 43 if (filePointer != NULL) {
el17cd 30:91038c2afec7 44 fprintf(filePointer, "%d", score); //write integer to sd card file
el17cd 30:91038c2afec7 45 fclose(filePointer);
el17cd 29:4a02f0bae202 46 }
el17cd 29:4a02f0bae202 47 }
el17cd 29:4a02f0bae202 48
el17cd 29:4a02f0bae202 49
el17cd 15:8fbbdefbe720 50 void Game::run(){
el17cd 30:91038c2afec7 51 inHomeMenu = true; //Start at home screen
el17cd 18:8256546a3cbf 52 score = 0;
el17cd 26:8a85aede976d 53 playing = true; //set game state to playing and death screen selection to 'restart'
el17cd 26:8a85aede976d 54 while(true) {
el17cd 30:91038c2afec7 55 processInput(); //process user input and store values in input struct
el17cd 26:8a85aede976d 56 renderer.clear();
el17cd 27:e46af658c67a 57 if(help > -1){
el17cd 30:91038c2afec7 58 helpScreen(); //Show the help screen if the help screen number is above -1
el17cd 27:e46af658c67a 59 }
el17cd 28:f8ff7c8c1627 60 else if(inHomeMenu){
el17cd 26:8a85aede976d 61 homeScreen();
el17cd 26:8a85aede976d 62 }
el17cd 26:8a85aede976d 63 else{
el17cd 26:8a85aede976d 64 play();
el17cd 15:8fbbdefbe720 65 }
el17cd 26:8a85aede976d 66 renderer.refresh(); //refresh lcd
el17cd 25:3995271e411c 67 }
el17cd 25:3995271e411c 68 }
el17cd 25:3995271e411c 69
el17cd 26:8a85aede976d 70 void Game::play(){
el17cd 26:8a85aede976d 71 renderer.drawHorizon(input.x/15); //draw the horizon line
el17cd 26:8a85aede976d 72
el17cd 26:8a85aede976d 73 for (int c = 0; c< noOfCubes; c++){
el17cd 26:8a85aede976d 74 moveCubes(&cubeArray[c]); //translate cubes depending on joystick location and score
el17cd 26:8a85aede976d 75 cubeToBeRendered(&cubeArray[c], c); //add all cube faces to array to later be rendered
el17cd 26:8a85aede976d 76 checkDespawn(&cubeArray[c]); //check if any cubes are behind the perspective
el17cd 26:8a85aede976d 77 checkDeath(&cubeArray[c]); //check if any cubes are too close to user
el17cd 26:8a85aede976d 78 }
el17cd 26:8a85aede976d 79 renderer.drawAllFaces(faceArray, noOfCubes, input.x); //draw all faces added to the face array
el17cd 26:8a85aede976d 80 displayDeathMenu(); //display death menu if cube is too close to user
el17cd 26:8a85aede976d 81 addScore();
el17cd 29:4a02f0bae202 82 renderer.printScore(score, 0, 0); //print score on top left of screen
el17cd 26:8a85aede976d 83 }
el17cd 26:8a85aede976d 84
el17cd 25:3995271e411c 85 void Game::checkDespawn(Cube *cube){ //checks if the cube is behind the perspective
el17cd 25:3995271e411c 86 if (cube->despawn()){
el17cd 25:3995271e411c 87 cube->resetPos(); //reset position to origin
el17cd 25:3995271e411c 88 cube->translate(rand()%250-125,0,140); //translate cube to new far away position
el17cd 25:3995271e411c 89 }
el17cd 25:3995271e411c 90 }
el17cd 25:3995271e411c 91
el17cd 25:3995271e411c 92 void Game::checkDeath(Cube *cube){ //Check whether the user has hit a cube
el17cd 25:3995271e411c 93 if (cube->tooClose()){
el17cd 25:3995271e411c 94 playing = false; //set state of game to not playing
el17cd 25:3995271e411c 95 cube->resetPos();
el17cd 25:3995271e411c 96 cube->translate(rand()%250-125,0,140); //reset and translate cube to back position
el17cd 15:8fbbdefbe720 97 }
el17cd 15:8fbbdefbe720 98 }
el17cd 18:8256546a3cbf 99
el17cd 25:3995271e411c 100 void Game::cubeToBeRendered(Cube *cube, int cubeIndex){ //Adds all faces within the cube to an array of faces to be rendered
el17cd 25:3995271e411c 101 for (int i = 0; i < 6; i++){
el17cd 25:3995271e411c 102 faceArray[cubeIndex*6 + i] = cube->getFace(i);
el17cd 25:3995271e411c 103 }
el17cd 25:3995271e411c 104 }
el17cd 25:3995271e411c 105
el17cd 29:4a02f0bae202 106
el17cd 25:3995271e411c 107 void Game::moveCubes(Cube *cube){ //animate cubes
el17cd 25:3995271e411c 108 if(playing){
el17cd 30:91038c2afec7 109 if(score < 6000)
el17cd 26:8a85aede976d 110 cube->translate(-input.x*1.4f,0,-1-(float)score/1000); //move cubes closer to user and in x axis depending on joystick pos
el17cd 25:3995271e411c 111 else{
el17cd 26:8a85aede976d 112 cube->translate(-input.x*1.4f,0,-3); //once max speed reached maintain constant z speed
el17cd 25:3995271e411c 113 }
el17cd 25:3995271e411c 114 }
el17cd 25:3995271e411c 115 else{
el17cd 25:3995271e411c 116 coord.x = 0; //if not playing (dead) prevent joystick moving anything
el17cd 25:3995271e411c 117 }
el17cd 25:3995271e411c 118 }
el17cd 25:3995271e411c 119
el17cd 29:4a02f0bae202 120 void Game::displayDeathMenu() { //display restart or back to home menu
el17cd 25:3995271e411c 121 if(!playing){
el17cd 29:4a02f0bae202 122 if(score > highScore) {
el17cd 29:4a02f0bae202 123 highScore = score;
el17cd 29:4a02f0bae202 124 writeHighScore(highScore);
el17cd 29:4a02f0bae202 125 }
el17cd 29:4a02f0bae202 126 renderer.drawDeathScreen(deathMenuSelection, highScore); //draw death screen if game over
el17cd 26:8a85aede976d 127 deathButtonSelections(); //select menu option
el17cd 25:3995271e411c 128 }
el17cd 26:8a85aede976d 129
el17cd 25:3995271e411c 130 }
el17cd 25:3995271e411c 131
el17cd 25:3995271e411c 132 void Game::addScore(){ //increment score by 1 each frame
el17cd 26:8a85aede976d 133 if(playing){
el17cd 26:8a85aede976d 134 score++; //add score if still playing
el17cd 26:8a85aede976d 135 }
el17cd 21:6b5d2d75e083 136 }
el17cd 21:6b5d2d75e083 137
el17cd 25:3995271e411c 138 void Game::resetScore(){ //reset score to 0
el17cd 21:6b5d2d75e083 139 score = 0;
el17cd 21:6b5d2d75e083 140 }
el17cd 22:236319885874 141
el17cd 25:3995271e411c 142 void Game::deathButtonSelections(){ //determine selection on death screen
el17cd 26:8a85aede976d 143 if(input.yButton){ //if y pressed highlight top option (restart)
el17cd 25:3995271e411c 144 deathMenuSelection = true;
el17cd 18:8256546a3cbf 145 }
el17cd 26:8a85aede976d 146 else if(input.aButton){ //if a pressed highlight bottom option (home menu)
el17cd 25:3995271e411c 147 deathMenuSelection = false;
el17cd 18:8256546a3cbf 148 }
el17cd 26:8a85aede976d 149 if (deathMenuSelection && input.bButton){ //if top option highlighted and b pressed then restart game
el17cd 18:8256546a3cbf 150 playing = true;
el17cd 18:8256546a3cbf 151 score = 0;
el17cd 21:6b5d2d75e083 152 resetScore();
el17cd 26:8a85aede976d 153 resetScene();
el17cd 18:8256546a3cbf 154 }
el17cd 26:8a85aede976d 155 else if(!deathMenuSelection && input.bButton){ //if bottom option highlighted and b pressed then go to home screen
el17cd 21:6b5d2d75e083 156 resetScore();
el17cd 28:f8ff7c8c1627 157 inHomeMenu = true;
el17cd 18:8256546a3cbf 158 }
el17cd 18:8256546a3cbf 159 }
el17cd 18:8256546a3cbf 160
el17cd 25:3995271e411c 161 void Game::homeButtonSelections(){ //determine selection on home screen
el17cd 26:8a85aede976d 162 if(input.yButton && homeSelection > 0){ //if top option isnt highlighted and y pressed then move highlight up
el17cd 18:8256546a3cbf 163 homeSelection--;
el17cd 18:8256546a3cbf 164 }
el17cd 26:8a85aede976d 165 else if(input.aButton && homeSelection < 2){ //if bottom option isnt highlighted and a pressed then move highlight down
el17cd 18:8256546a3cbf 166 homeSelection++;
el17cd 18:8256546a3cbf 167 }
el17cd 26:8a85aede976d 168 if (input.bButton && homeSelection == 0){ //if top highlighted and b pressed then start game
el17cd 28:f8ff7c8c1627 169 inHomeMenu = false;
el17cd 30:91038c2afec7 170 playing = true;
el17cd 18:8256546a3cbf 171 }
el17cd 26:8a85aede976d 172 else if(input.bButton && homeSelection == 1){ //if bottom highlighted and b pressed then exit game
el17cd 27:e46af658c67a 173 help = 0;
el17cd 26:8a85aede976d 174 }
el17cd 26:8a85aede976d 175 else if(input.bButton && homeSelection == 2){ //if bottom highlighted and b pressed then exit game
el17cd 26:8a85aede976d 176 renderer.turnOff();
el17cd 26:8a85aede976d 177 exit(0);
el17cd 18:8256546a3cbf 178 }
el17cd 18:8256546a3cbf 179 }
el17cd 18:8256546a3cbf 180
el17cd 30:91038c2afec7 181 void Game::homeScreen(){//draw home screen
el17cd 26:8a85aede976d 182 homeButtonSelections(); //determine selection on home screen
el17cd 30:91038c2afec7 183 renderer.drawHomeScreen(homeSelection);
el17cd 27:e46af658c67a 184 }
el17cd 27:e46af658c67a 185
el17cd 30:91038c2afec7 186 void Game::helpScreen(){ //Show help screen depending on help screen number
el17cd 27:e46af658c67a 187 if (help < 2) {
el17cd 27:e46af658c67a 188 renderer.drawHelpScreen1();
el17cd 27:e46af658c67a 189 checkNextHelpScreen();
el17cd 27:e46af658c67a 190 }
el17cd 27:e46af658c67a 191 else if (help == 2) {
el17cd 30:91038c2afec7 192 renderer.drawHelpScreen2();
el17cd 27:e46af658c67a 193 checkNextHelpScreen();
el17cd 27:e46af658c67a 194 }
el17cd 27:e46af658c67a 195 else if (help == 3) {
el17cd 27:e46af658c67a 196 renderer.drawHelpScreen3();
el17cd 27:e46af658c67a 197 checkNextHelpScreen();
el17cd 27:e46af658c67a 198 }
el17cd 30:91038c2afec7 199 else if (help == 4) { //if past last screen then set help screen number to disabled (-1)
el17cd 27:e46af658c67a 200 help = -1;
el17cd 27:e46af658c67a 201 }
el17cd 27:e46af658c67a 202 }
el17cd 27:e46af658c67a 203
el17cd 30:91038c2afec7 204 void Game::checkNextHelpScreen(){ //if a button pressed then advance help screen
el17cd 27:e46af658c67a 205 if(input.bButton){
el17cd 27:e46af658c67a 206 help ++;
el17cd 27:e46af658c67a 207 }
el17cd 26:8a85aede976d 208 }
el17cd 26:8a85aede976d 209
el17cd 30:91038c2afec7 210 void Game::processInput(){ //Obtain user inputs and store in input struct
el17cd 30:91038c2afec7 211 input.x = gamepad.get_coord().x; //Get value of joystick x axis
el17cd 26:8a85aede976d 212 bool y = gamepad.check_event(Gamepad::Y_PRESSED);
el17cd 26:8a85aede976d 213 bool a = gamepad.check_event(Gamepad::A_PRESSED);
el17cd 26:8a85aede976d 214 bool b = gamepad.check_event(Gamepad::B_PRESSED);
el17cd 26:8a85aede976d 215
el17cd 26:8a85aede976d 216 disableYButton(y);
el17cd 26:8a85aede976d 217 disableAButton(a);
el17cd 26:8a85aede976d 218 disableBButton(b);
el17cd 26:8a85aede976d 219 }
el17cd 26:8a85aede976d 220
el17cd 30:91038c2afec7 221 void Game::disableYButton(bool y){ //Set y button to disabled, call function to reenable in 0.3 seconds
el17cd 26:8a85aede976d 222 if(!input.yCooldown && y){
el17cd 26:8a85aede976d 223 input.yCooldown = true;
el17cd 30:91038c2afec7 224 disableY.attach(callback(this, &Game::enableY), 0.3); //attach function to ticker to renable y button
el17cd 26:8a85aede976d 225 input.yButton = true;
el17cd 26:8a85aede976d 226 }
el17cd 26:8a85aede976d 227 else{
el17cd 26:8a85aede976d 228 input.yButton = false;
el17cd 18:8256546a3cbf 229 }
el17cd 18:8256546a3cbf 230 }
el17cd 26:8a85aede976d 231
el17cd 30:91038c2afec7 232 void Game::disableAButton(bool a){ //Set a button to disabled, call function to reenable in 0.3 seconds
el17cd 26:8a85aede976d 233 if(!input.aCooldown && a){
el17cd 26:8a85aede976d 234 input.aCooldown = true;
el17cd 30:91038c2afec7 235 disableA.attach(callback(this, &Game::enableA), 0.3); //attach function to ticker to renable a button
el17cd 26:8a85aede976d 236 input.aButton = true;
el17cd 26:8a85aede976d 237 }
el17cd 26:8a85aede976d 238 else{
el17cd 26:8a85aede976d 239 input.aButton = false;
el17cd 26:8a85aede976d 240 }
el17cd 26:8a85aede976d 241 }
el17cd 26:8a85aede976d 242
el17cd 30:91038c2afec7 243 void Game::disableBButton(bool b){ //Set b button to disabled, call function to reenable in 0.3 seconds
el17cd 26:8a85aede976d 244 if(!input.bCooldown && b){
el17cd 26:8a85aede976d 245 input.bCooldown = true;
el17cd 30:91038c2afec7 246 disableB.attach(callback(this, &Game::enableB), 0.3); //attach function to ticker to renable b button
el17cd 26:8a85aede976d 247 input.bButton = true;
el17cd 26:8a85aede976d 248 }
el17cd 26:8a85aede976d 249 else{
el17cd 26:8a85aede976d 250 input.bButton = false;
el17cd 26:8a85aede976d 251 }
el17cd 26:8a85aede976d 252 }
el17cd 26:8a85aede976d 253
el17cd 30:91038c2afec7 254 void Game::enableY(){ //reenable y button
el17cd 30:91038c2afec7 255 disableY.detach(); //detach ticker so function only runs once
el17cd 30:91038c2afec7 256 input.yCooldown = false;
el17cd 30:91038c2afec7 257 }
el17cd 30:91038c2afec7 258
el17cd 30:91038c2afec7 259 void Game::enableA(){ //reenable a button
el17cd 30:91038c2afec7 260 disableA.detach(); //detach ticker so function only runs once
el17cd 26:8a85aede976d 261 input.aCooldown = false;
el17cd 26:8a85aede976d 262 }
el17cd 26:8a85aede976d 263
el17cd 30:91038c2afec7 264 void Game::enableB(){ //reenable b button
el17cd 30:91038c2afec7 265 disableB.detach(); //detach ticker so function only runs once
el17cd 26:8a85aede976d 266 input.bCooldown = false;
el17cd 26:8a85aede976d 267 }