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