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