ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Committer:
el17cd
Date:
Thu Apr 04 20:13:39 2019 +0000
Revision:
27:e46af658c67a
Parent:
26:8a85aede976d
Child:
28:f8ff7c8c1627
Added interactive help menu and imported sd card library;

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