ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

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?

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