Dependencies: mbed
Game/Game.cpp@15:5bf3f951d337, 2020-05-18 (annotated)
- Committer:
- KaifK
- Date:
- Mon May 18 18:03:43 2020 +0000
- Revision:
- 15:5bf3f951d337
- Parent:
- 14:652fd55aebcf
- Child:
- 16:1f196a0e12be
Game v1 complete (still some debounce errors)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
KaifK | 4:08a0ff6668df | 1 | #include "Game.h" |
KaifK | 8:5ede90f99a27 | 2 | |
KaifK | 9:e6566d09f087 | 3 | Game::Game(N5110 &lcd, Gamepad &pad, Ball &ball) { |
KaifK | 9:e6566d09f087 | 4 | _lcd = &lcd; |
KaifK | 9:e6566d09f087 | 5 | _pad = &pad; |
KaifK | 9:e6566d09f087 | 6 | _ball = &ball; |
KaifK | 9:e6566d09f087 | 7 | } |
KaifK | 4:08a0ff6668df | 8 | Game::~Game() {} |
KaifK | 4:08a0ff6668df | 9 | |
KaifK | 4:08a0ff6668df | 10 | void Game::init() { |
KaifK | 4:08a0ff6668df | 11 | _is_goal = false; |
KaifK | 8:5ede90f99a27 | 12 | _lives = 3; |
KaifK | 12:ca7329a41fc5 | 13 | _level = 1; |
KaifK | 8:5ede90f99a27 | 14 | _score = 0; |
KaifK | 9:e6566d09f087 | 15 | _speed = 0.30f; |
KaifK | 9:e6566d09f087 | 16 | _x_val = 42.00f; |
KaifK | 9:e6566d09f087 | 17 | _y_val = 0.00f; |
KaifK | 7:2a3b566aedd3 | 18 | _shot_x = 0; |
KaifK | 7:2a3b566aedd3 | 19 | _shot_y = 0; |
KaifK | 4:08a0ff6668df | 20 | } |
KaifK | 9:e6566d09f087 | 21 | void Game::play() { |
KaifK | 14:652fd55aebcf | 22 | // if all lives are lost or start is pressed game ends |
KaifK | 14:652fd55aebcf | 23 | while(_lives > 0 && !_pad->start_pressed()) { |
KaifK | 15:5bf3f951d337 | 24 | _level = random_level_gen(10); //generate random level |
KaifK | 12:ca7329a41fc5 | 25 | printf("Level (in game) = %d \n", _level); |
KaifK | 15:5bf3f951d337 | 26 | _ball->set_level(_level); //set level |
KaifK | 15:5bf3f951d337 | 27 | readInput(); //take input |
KaifK | 15:5bf3f951d337 | 28 | _ball->isGoal(_level, _shot_x, _shot_y); //check if goal |
KaifK | 15:5bf3f951d337 | 29 | //goal scored |
KaifK | 12:ca7329a41fc5 | 30 | if(_ball->get_goal()) { |
KaifK | 15:5bf3f951d337 | 31 | _ball->playShot(_shot_x, _shot_y); |
KaifK | 12:ca7329a41fc5 | 32 | _score++; |
KaifK | 15:5bf3f951d337 | 33 | print_goal_message(1); |
KaifK | 12:ca7329a41fc5 | 34 | } |
KaifK | 15:5bf3f951d337 | 35 | //goal missed |
KaifK | 15:5bf3f951d337 | 36 | else { |
KaifK | 15:5bf3f951d337 | 37 | // ball should not go through obstacle hence y value limited to 21 |
KaifK | 15:5bf3f951d337 | 38 | // this is done after calculations to ensure accurate results |
KaifK | 15:5bf3f951d337 | 39 | if(_shot_y >= 6) { _shot_y = 21; } |
KaifK | 15:5bf3f951d337 | 40 | _ball->playShot(_shot_x, _shot_y); |
KaifK | 15:5bf3f951d337 | 41 | _lives--; |
KaifK | 15:5bf3f951d337 | 42 | print_goal_message(0); |
KaifK | 15:5bf3f951d337 | 43 | } |
KaifK | 15:5bf3f951d337 | 44 | updateSpeed(); |
KaifK | 12:ca7329a41fc5 | 45 | } |
KaifK | 8:5ede90f99a27 | 46 | } |
KaifK | 7:2a3b566aedd3 | 47 | |
KaifK | 9:e6566d09f087 | 48 | void Game::readInput() { |
KaifK | 9:e6566d09f087 | 49 | _x_val = 42; //reset x_val |
KaifK | 9:e6566d09f087 | 50 | _y_val = 0; //reset y_val |
KaifK | 9:e6566d09f087 | 51 | while(!_pad->A_pressed()) { |
KaifK | 9:e6566d09f087 | 52 | pointer_input(); |
KaifK | 7:2a3b566aedd3 | 53 | } |
KaifK | 9:e6566d09f087 | 54 | wait(0.1); |
KaifK | 9:e6566d09f087 | 55 | while(!_pad->B_pressed()) { |
KaifK | 9:e6566d09f087 | 56 | power_meter_input(); |
KaifK | 6:09a555c0d997 | 57 | } |
KaifK | 9:e6566d09f087 | 58 | wait(0.1); |
KaifK | 8:5ede90f99a27 | 59 | convert_to_shot_x(); |
KaifK | 7:2a3b566aedd3 | 60 | convert_to_shot_y(); |
KaifK | 9:e6566d09f087 | 61 | printf("x val = %.2f \n",_x_val); |
KaifK | 7:2a3b566aedd3 | 62 | printf("shot_x val = %d \n",_shot_x); |
KaifK | 9:e6566d09f087 | 63 | printf("y val = %.2f \n",_y_val); |
KaifK | 7:2a3b566aedd3 | 64 | printf("shot_y val = %d \n",_shot_y); |
KaifK | 7:2a3b566aedd3 | 65 | |
KaifK | 6:09a555c0d997 | 66 | } |
KaifK | 9:e6566d09f087 | 67 | void Game::updateLives() { |
KaifK | 15:5bf3f951d337 | 68 | _pad->leds(0.0); |
KaifK | 5:ed71996c0534 | 69 | switch(_lives){ |
KaifK | 14:652fd55aebcf | 70 | case 0: |
KaifK | 14:652fd55aebcf | 71 | break; |
KaifK | 5:ed71996c0534 | 72 | case 1: |
KaifK | 9:e6566d09f087 | 73 | _pad->led(1,1.0); //red leds only |
KaifK | 9:e6566d09f087 | 74 | _pad->led(4,1.0); |
KaifK | 5:ed71996c0534 | 75 | break; |
KaifK | 5:ed71996c0534 | 76 | case 2: |
KaifK | 9:e6566d09f087 | 77 | _pad->led(1,1.0); //red and yellow leds |
KaifK | 9:e6566d09f087 | 78 | _pad->led(2,1.0); |
KaifK | 9:e6566d09f087 | 79 | _pad->led(4,1.0); |
KaifK | 9:e6566d09f087 | 80 | _pad->led(5,1.0); |
KaifK | 5:ed71996c0534 | 81 | break; |
KaifK | 5:ed71996c0534 | 82 | case 3: |
KaifK | 9:e6566d09f087 | 83 | _pad->leds(1.0); |
KaifK | 5:ed71996c0534 | 84 | break; |
KaifK | 5:ed71996c0534 | 85 | default: |
KaifK | 7:2a3b566aedd3 | 86 | error("Invalid Number of Lives"); |
KaifK | 5:ed71996c0534 | 87 | break; |
KaifK | 5:ed71996c0534 | 88 | } |
KaifK | 15:5bf3f951d337 | 89 | // +1 life if score hits a multiple of 5 provided less than 3 lives left |
KaifK | 15:5bf3f951d337 | 90 | if(_score % 5 == 0 && _score != 0 && _lives != 3) { _lives++; } |
KaifK | 13:5133f00d2a2d | 91 | printf("Lives = %d \n", _lives); |
KaifK | 5:ed71996c0534 | 92 | } |
KaifK | 9:e6566d09f087 | 93 | void Game::updateScore() { |
KaifK | 5:ed71996c0534 | 94 | char buffer[12]; |
KaifK | 5:ed71996c0534 | 95 | sprintf(buffer,"%d",_score); |
KaifK | 9:e6566d09f087 | 96 | _lcd->printString(buffer,2,5); |
KaifK | 9:e6566d09f087 | 97 | } |
KaifK | 9:e6566d09f087 | 98 | void Game::updateSpeed() { |
KaifK | 9:e6566d09f087 | 99 | if(abs(_speed) <= 2) { // max speed = 1 |
KaifK | 13:5133f00d2a2d | 100 | if(_score % 3 == 0 && _score != 0) { |
KaifK | 9:e6566d09f087 | 101 | _speed = abs(_speed) + 0.20f; |
KaifK | 9:e6566d09f087 | 102 | } |
KaifK | 9:e6566d09f087 | 103 | } |
KaifK | 9:e6566d09f087 | 104 | printf("speed = %.2f \n", _speed); |
KaifK | 9:e6566d09f087 | 105 | printf("score = %d \n", _score); |
KaifK | 5:ed71996c0534 | 106 | } |
KaifK | 7:2a3b566aedd3 | 107 | |
KaifK | 9:e6566d09f087 | 108 | void Game::pointer_input() { |
KaifK | 9:e6566d09f087 | 109 | updateScore(); |
KaifK | 15:5bf3f951d337 | 110 | updateLives(); |
KaifK | 12:ca7329a41fc5 | 111 | _ball->displayBackground(); |
KaifK | 9:e6566d09f087 | 112 | _ball->init(); |
KaifK | 7:2a3b566aedd3 | 113 | //draw aim pointer |
KaifK | 9:e6566d09f087 | 114 | _lcd->drawLine(WIDTH / 2 - 5, 41, _x_val, HEIGHT / 2 + 7, 1);//left side |
KaifK | 9:e6566d09f087 | 115 | _lcd->drawLine(WIDTH / 2 + 5, 41, _x_val, HEIGHT / 2 + 7, 1);//right side |
KaifK | 12:ca7329a41fc5 | 116 | _lcd->drawLine(WIDTH / 2 + 5, 41, WIDTH / 2 - 5, 41, 1); //base |
KaifK | 7:2a3b566aedd3 | 117 | _x_val += _speed; |
KaifK | 9:e6566d09f087 | 118 | //printf("dir = %d \n", _speed); |
KaifK | 9:e6566d09f087 | 119 | if((int)_x_val >= 70) { _speed = (-1 * _speed); } |
KaifK | 9:e6566d09f087 | 120 | //pointer points out of screen i.e. 70=84 therefore, switch direction |
KaifK | 7:2a3b566aedd3 | 121 | //value found through trial and error using print statement |
KaifK | 9:e6566d09f087 | 122 | else if((int)_x_val <= 12) { _speed = abs(_speed); } |
KaifK | 9:e6566d09f087 | 123 | _lcd->refresh(); |
KaifK | 9:e6566d09f087 | 124 | _lcd->clear(); |
KaifK | 7:2a3b566aedd3 | 125 | wait(0.01); |
KaifK | 7:2a3b566aedd3 | 126 | } |
KaifK | 9:e6566d09f087 | 127 | void Game::power_meter_input() { |
KaifK | 9:e6566d09f087 | 128 | updateScore(); |
KaifK | 12:ca7329a41fc5 | 129 | _ball->displayBackground(); |
KaifK | 12:ca7329a41fc5 | 130 | _ball->init(); |
KaifK | 7:2a3b566aedd3 | 131 | //keep direction of pointer |
KaifK | 9:e6566d09f087 | 132 | _lcd->drawLine(WIDTH / 2 - 5, 41, _x_val, HEIGHT / 2 + 7, 1); |
KaifK | 9:e6566d09f087 | 133 | _lcd->drawLine(WIDTH / 2 + 5, 41, _x_val, HEIGHT / 2 + 7, 1); |
KaifK | 12:ca7329a41fc5 | 134 | _lcd->drawLine(WIDTH / 2 + 5, 41, WIDTH / 2 - 5, 41, 1); |
KaifK | 7:2a3b566aedd3 | 135 | //fill and empty power meter |
KaifK | 9:e6566d09f087 | 136 | _lcd->drawRect(77,27,6,_y_val,FILL_BLACK); |
KaifK | 9:e6566d09f087 | 137 | _y_val += _speed/2; |
KaifK | 9:e6566d09f087 | 138 | if((int)_y_val >= 20) { _speed = (-1 * _speed); } //power meter full |
KaifK | 9:e6566d09f087 | 139 | else if((int)_y_val <= 0) { _speed = abs(_speed); } // power meter empty |
KaifK | 9:e6566d09f087 | 140 | _lcd->refresh(); |
KaifK | 9:e6566d09f087 | 141 | _lcd->clear(); |
KaifK | 7:2a3b566aedd3 | 142 | wait(0.01); |
KaifK | 7:2a3b566aedd3 | 143 | } |
KaifK | 7:2a3b566aedd3 | 144 | void Game::convert_to_shot_x() { |
KaifK | 9:e6566d09f087 | 145 | //convert from range 12-70 (range of pointer) to 0-84 (range of screen) |
KaifK | 9:e6566d09f087 | 146 | _shot_x = ((((int)_x_val - 12) * (84)) / (70 - 12)); |
KaifK | 8:5ede90f99a27 | 147 | //ball misses goal completely |
KaifK | 9:e6566d09f087 | 148 | if(_shot_x <=7) { _shot_x = -20;} |
KaifK | 9:e6566d09f087 | 149 | else if(_shot_x >=77) { _shot_x = 104;} |
KaifK | 7:2a3b566aedd3 | 150 | } |
KaifK | 7:2a3b566aedd3 | 151 | void Game::convert_to_shot_y() { |
KaifK | 9:e6566d09f087 | 152 | _shot_y = ((((int)_y_val) * (24)) / (20)); |
KaifK | 15:5bf3f951d337 | 153 | if(_shot_y <= 2) {_shot_y = -6; } //shot too high |
KaifK | 9:e6566d09f087 | 154 | else if (_shot_y >= 19) {_shot_y = 19; }//shot is low, but must enter goal |
KaifK | 9:e6566d09f087 | 155 | } |
KaifK | 9:e6566d09f087 | 156 | int Game::random_level_gen(int limit) { |
KaifK | 15:5bf3f951d337 | 157 | int number = (rand() % limit) + 1; //random level between 1-10 |
KaifK | 15:5bf3f951d337 | 158 | return number; |
KaifK | 15:5bf3f951d337 | 159 | } |
KaifK | 15:5bf3f951d337 | 160 | void Game::print_goal_message(int n) { |
KaifK | 15:5bf3f951d337 | 161 | _ball->displayBackground(); |
KaifK | 15:5bf3f951d337 | 162 | _lcd->drawRect(0,14,84,11,FILL_WHITE);//white background |
KaifK | 15:5bf3f951d337 | 163 | _lcd->drawRect(0,14,84,11,FILL_TRANSPARENT);//white background |
KaifK | 15:5bf3f951d337 | 164 | |
KaifK | 15:5bf3f951d337 | 165 | switch(n) { |
KaifK | 15:5bf3f951d337 | 166 | case 0: |
KaifK | 15:5bf3f951d337 | 167 | _lcd->printString("MISS!",30,2); |
KaifK | 15:5bf3f951d337 | 168 | break; |
KaifK | 15:5bf3f951d337 | 169 | case 1: |
KaifK | 15:5bf3f951d337 | 170 | _lcd->printString("GOAL!",30,2); |
KaifK | 15:5bf3f951d337 | 171 | break; |
KaifK | 15:5bf3f951d337 | 172 | } |
KaifK | 15:5bf3f951d337 | 173 | _lcd->refresh(); |
KaifK | 15:5bf3f951d337 | 174 | wait(1.5); |
KaifK | 7:2a3b566aedd3 | 175 | } |
KaifK | 7:2a3b566aedd3 | 176 | |
KaifK | 8:5ede90f99a27 | 177 |