ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

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?

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 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 }