ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Committer:
el17cd
Date:
Thu Apr 04 22:04:10 2019 +0000
Revision:
29:4a02f0bae202
Parent:
28:f8ff7c8c1627
Child:
30:91038c2afec7
added high score printing, sd card library not working

Who changed what in which revision?

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