ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Sat Apr 20 14:46:50 2019 +0000
Revision:
21:20478f086bc2
Parent:
20:a8cad4e044ea
Child:
22:d2969236b4f3
Child:
23:ff9073e12106
Fully documented and commented all classes and functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lewisgw 5:eda40cdde3e7 1 #include "Engine.h"
lewisgw 5:eda40cdde3e7 2
lewisgw 21:20478f086bc2 3 // Buffer to print updated score.
lewisgw 21:20478f086bc2 4 char buffer[14];
lewisgw 15:876c047a6ec9 5
lewisgw 21:20478f086bc2 6 // Constructor and destructor.
lewisgw 9:fff2009f826e 7 Engine::Engine() {}
lewisgw 5:eda40cdde3e7 8
lewisgw 9:fff2009f826e 9 Engine::~Engine() {}
lewisgw 5:eda40cdde3e7 10
lewisgw 15:876c047a6ec9 11 void Engine::init() {
lewisgw 15:876c047a6ec9 12 reset_skater();
lewisgw 17:f377df4ea7b1 13 reset_engine();
lewisgw 21:20478f086bc2 14 srand(time(NULL)); // Set up for generating random numbers
lewisgw 15:876c047a6ec9 15 }
lewisgw 15:876c047a6ec9 16
lewisgw 20:a8cad4e044ea 17 void Engine::check_reset(N5110 &lcd, Gamepad &gamepad) {
lewisgw 21:20478f086bc2 18 // If reset flag is true, end and restart the game.
lewisgw 9:fff2009f826e 19 if (_skater.get_reset_flag()) {
lewisgw 21:20478f086bc2 20 execute_dying_sequence(lcd, gamepad);
lewisgw 8:5327418f823a 21 wait(1);
lewisgw 20:a8cad4e044ea 22 reset_skater();
lewisgw 20:a8cad4e044ea 23 reset_engine();
lewisgw 9:fff2009f826e 24 }
lewisgw 9:fff2009f826e 25 }
lewisgw 9:fff2009f826e 26
lewisgw 21:20478f086bc2 27 void Engine::execute_dying_sequence(N5110 &lcd, Gamepad &gamepad) {
lewisgw 21:20478f086bc2 28 wait(1);
lewisgw 21:20478f086bc2 29 lcd.clear();
lewisgw 21:20478f086bc2 30 for (int i = 0; i < 40; i = i + 8) { // Counter for y direction, sweeps top
lewisgw 21:20478f086bc2 31 // to bottom.
lewisgw 21:20478f086bc2 32 for (int j = 0; j < 84; j++) { // Counter for x direction, sweeps L to R
lewisgw 21:20478f086bc2 33 lcd.setPixel(j,i,true);
lewisgw 21:20478f086bc2 34 lcd.setPixel(i,j,true);
lewisgw 21:20478f086bc2 35 lcd.printString("TRY AGAIN",30,5);
lewisgw 21:20478f086bc2 36 lcd.refresh();
lewisgw 21:20478f086bc2 37 gamepad.tone(int(1099 - 15.4*j - 1.2*i), 0.05); // Frequnecy of tone is
lewisgw 21:20478f086bc2 38 // dependent on counters.
lewisgw 21:20478f086bc2 39 wait(0.001);
lewisgw 21:20478f086bc2 40 sprintf(buffer,"%2d",_player_score);
lewisgw 21:20478f086bc2 41 lcd.printString(buffer,0,5);
lewisgw 21:20478f086bc2 42 }
lewisgw 21:20478f086bc2 43 }
lewisgw 21:20478f086bc2 44 }
lewisgw 21:20478f086bc2 45
lewisgw 9:fff2009f826e 46 void Engine::reset_skater() {
lewisgw 18:304700b5d8f8 47 _skater_direction = Left;
lewisgw 21:20478f086bc2 48 _start_platform_flag = true; // For printing start text in EngineController
lewisgw 17:f377df4ea7b1 49 _skater.set_reset_flag(false);
lewisgw 19:f35887b14c23 50 _moving_counter = 0;
lewisgw 21:20478f086bc2 51 _jump_counter = 20;
lewisgw 19:f35887b14c23 52 _fall_flag = false;
lewisgw 17:f377df4ea7b1 53 }
lewisgw 17:f377df4ea7b1 54
lewisgw 17:f377df4ea7b1 55 void Engine::reset_engine() {
lewisgw 17:f377df4ea7b1 56 _input.coord.x = 0;
lewisgw 17:f377df4ea7b1 57 _input.coord.y = 0;
lewisgw 17:f377df4ea7b1 58 _input.A_flag = false;
lewisgw 21:20478f086bc2 59 _lower_platforms.init(40); // 40 is the platform y coord.
lewisgw 21:20478f086bc2 60 _upper_platforms.init(22); // 22 is the platform y coord.
lewisgw 17:f377df4ea7b1 61 _coin.init();
lewisgw 18:304700b5d8f8 62 _fire.init();
lewisgw 17:f377df4ea7b1 63 _coin_collision_flag = false;
lewisgw 17:f377df4ea7b1 64 _player_score = 0;
lewisgw 9:fff2009f826e 65 }
lewisgw 8:5327418f823a 66
lewisgw 5:eda40cdde3e7 67 void Engine::read_input(Gamepad &gamepad) {
lewisgw 9:fff2009f826e 68 _input.coord = gamepad.get_mapped_coord();
lewisgw 9:fff2009f826e 69 _input.A_flag = gamepad.check_event(Gamepad::A_PRESSED);
lewisgw 9:fff2009f826e 70 }
lewisgw 5:eda40cdde3e7 71
lewisgw 20:a8cad4e044ea 72 void Engine::process_y(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 73 // Sets the y coord by first checking if the skater should be falling.
lewisgw 9:fff2009f826e 74 set_fall_flag();
lewisgw 9:fff2009f826e 75 if (_fall_flag) {
lewisgw 20:a8cad4e044ea 76 _skater.fall(_fall_flag, gamepad);
lewisgw 9:fff2009f826e 77 } else {
lewisgw 21:20478f086bc2 78 _skater.set_y_position( _input.A_flag, _jump_counter, _level_condition,
lewisgw 21:20478f086bc2 79 gamepad);
lewisgw 9:fff2009f826e 80 }
lewisgw 21:20478f086bc2 81 _fall_flag = _skater.get_fall_flag(); // Update fall flag.
lewisgw 18:304700b5d8f8 82 _skater_y = _skater.get_y_position();
lewisgw 21:20478f086bc2 83 _jump_counter = _skater.get_jump_counter(); // Update jump counter.
lewisgw 9:fff2009f826e 84 }
lewisgw 14:9861fe85c803 85
lewisgw 9:fff2009f826e 86 void Engine::set_fall_flag() {
lewisgw 21:20478f086bc2 87 // Set the fall flag to true if the skater is not on one of the lower
lewisgw 21:20478f086bc2 88 // platforms.
lewisgw 21:20478f086bc2 89 if (((_lower_line_1.x_end < _skater_x)
lewisgw 21:20478f086bc2 90 && (_skater_x < (_lower_line_2.x_start - 6)))
lewisgw 21:20478f086bc2 91 && _skater_y == 23) {
lewisgw 9:fff2009f826e 92 _fall_flag = true;
lewisgw 21:20478f086bc2 93 } else if (((_lower_line_2.x_end < _skater_x)
lewisgw 21:20478f086bc2 94 && (_skater_x < (_lower_line_3.x_start - 6)))
lewisgw 21:20478f086bc2 95 && _skater_y == 23) {
lewisgw 9:fff2009f826e 96 _fall_flag = true;
lewisgw 21:20478f086bc2 97 } else if (((_lower_line_3.x_end < _skater_x)
lewisgw 21:20478f086bc2 98 && (_skater_x < (_lower_line_1.x_start - 6)))
lewisgw 21:20478f086bc2 99 && _skater_y == 23) {
lewisgw 9:fff2009f826e 100 _fall_flag = true;
lewisgw 9:fff2009f826e 101 }
lewisgw 9:fff2009f826e 102 }
lewisgw 5:eda40cdde3e7 103
lewisgw 17:f377df4ea7b1 104 void Engine::process_x(int game_counter) {
lewisgw 21:20478f086bc2 105 // Sets the x coord.
lewisgw 17:f377df4ea7b1 106 _skater.set_x_position_and_sprite(_input.coord.x,
lewisgw 17:f377df4ea7b1 107 _moving_counter,
lewisgw 18:304700b5d8f8 108 _skater_direction,
lewisgw 17:f377df4ea7b1 109 _input.coord.y);
lewisgw 18:304700b5d8f8 110 _skater_x = _skater.get_x_position();
lewisgw 21:20478f086bc2 111 _moving_counter = _skater.get_moving_counter(); // Update moving counter.
lewisgw 17:f377df4ea7b1 112 _speed_divider = int(-0.05*_player_score + 4);
lewisgw 21:20478f086bc2 113 if ((game_counter % _speed_divider == 0) && (_input.coord.x > -0.1)) {
lewisgw 21:20478f086bc2 114 // Move the skater along with platforms at rate determined by speed divider.
lewisgw 17:f377df4ea7b1 115 _moving_counter--;
lewisgw 9:fff2009f826e 116 }
lewisgw 9:fff2009f826e 117 }
lewisgw 5:eda40cdde3e7 118
lewisgw 5:eda40cdde3e7 119 void Engine::process_sprite() {
lewisgw 14:9861fe85c803 120 // Update the sprite and direction.
lewisgw 18:304700b5d8f8 121 _skater_sprite = _skater.get_sprite_value();
lewisgw 18:304700b5d8f8 122 _skater_direction = _skater.get_direction();
lewisgw 9:fff2009f826e 123 }
lewisgw 5:eda40cdde3e7 124
lewisgw 5:eda40cdde3e7 125
lewisgw 10:8bf3713d9e9c 126 void Engine::set_level_condition() {
lewisgw 14:9861fe85c803 127 // If the skater is under or on top of any of the upper platforms, set
lewisgw 14:9861fe85c803 128 // level condition to 1.
lewisgw 21:20478f086bc2 129 if (((_upper_line_1.x_start - 6) <= _skater_x)
lewisgw 21:20478f086bc2 130 && (_skater_x <= _upper_line_1.x_end)) {
lewisgw 10:8bf3713d9e9c 131 _level_condition = 1;
lewisgw 21:20478f086bc2 132 } else if (((_upper_line_2.x_start - 6) <= _skater_x)
lewisgw 21:20478f086bc2 133 && (_skater_x <= _upper_line_2.x_end)) {
lewisgw 10:8bf3713d9e9c 134 _level_condition = 1;
lewisgw 21:20478f086bc2 135 } else if (((_upper_line_3.x_start - 6) <= _skater_x)
lewisgw 21:20478f086bc2 136 && (_skater_x <= _upper_line_3.x_end)) {
lewisgw 10:8bf3713d9e9c 137 _level_condition = 1;
lewisgw 9:fff2009f826e 138 } else {
lewisgw 10:8bf3713d9e9c 139 _level_condition = 0;
lewisgw 10:8bf3713d9e9c 140 }
lewisgw 9:fff2009f826e 141 }
lewisgw 7:bbc2b75c1418 142
lewisgw 17:f377df4ea7b1 143 void Engine::generate_level(int game_counter) {
lewisgw 10:8bf3713d9e9c 144 generate_lower_lines();
lewisgw 10:8bf3713d9e9c 145 generate_upper_lines();
lewisgw 15:876c047a6ec9 146 _coin.generate_coin();
lewisgw 18:304700b5d8f8 147 generate_fire(game_counter);
lewisgw 9:fff2009f826e 148 }
lewisgw 5:eda40cdde3e7 149
lewisgw 10:8bf3713d9e9c 150 void Engine::generate_lower_lines() {
lewisgw 14:9861fe85c803 151 // Use a scaled random number to generate the length of the lower lines.
lewisgw 10:8bf3713d9e9c 152 _length_1 = (rand() %20) + 10;
lewisgw 21:20478f086bc2 153 _lower_platforms.set_line_1(_length_1);
lewisgw 18:304700b5d8f8 154 _lower_line_1 = _lower_platforms.get_line_1();
lewisgw 10:8bf3713d9e9c 155 _length_2 = (rand() %20) + 10;
lewisgw 21:20478f086bc2 156 _lower_platforms.set_line_2(_length_2);
lewisgw 18:304700b5d8f8 157 _lower_line_2 = _lower_platforms.get_line_2();
lewisgw 10:8bf3713d9e9c 158 _length_3 = (rand() %20) + 10;
lewisgw 21:20478f086bc2 159 _lower_platforms.set_line_3(_length_3);
lewisgw 18:304700b5d8f8 160 _lower_line_3 = _lower_platforms.get_line_3();
lewisgw 10:8bf3713d9e9c 161 }
lewisgw 10:8bf3713d9e9c 162
lewisgw 10:8bf3713d9e9c 163 void Engine::generate_upper_lines() {
lewisgw 21:20478f086bc2 164 // Set the length of the upper lines to be proportionally smaller to
lewisgw 21:20478f086bc2 165 // the length of the lower lines.
lewisgw 21:20478f086bc2 166 _upper_platforms.set_line_1(_length_1 / 2);
lewisgw 18:304700b5d8f8 167 _upper_line_1 = _upper_platforms.get_line_1();
lewisgw 21:20478f086bc2 168 _upper_platforms.set_line_2(_length_2 / 2);
lewisgw 18:304700b5d8f8 169 _upper_line_2 = _upper_platforms.get_line_2();
lewisgw 21:20478f086bc2 170 _upper_platforms.set_line_3(_length_3 / 2);
lewisgw 18:304700b5d8f8 171 _upper_line_3 = _upper_platforms.get_line_3();
lewisgw 10:8bf3713d9e9c 172 }
lewisgw 5:eda40cdde3e7 173
lewisgw 18:304700b5d8f8 174 void Engine::generate_fire(int game_counter) {
lewisgw 21:20478f086bc2 175 // Generates the x and y coordinate of the fire. Y oscillates from 5 to 23.
lewisgw 21:20478f086bc2 176 _fire.generate_fire(); // Generates X coord of fire.
lewisgw 21:20478f086bc2 177 _fire_y = int(-0.0073*game_counter*game_counter + 0.73*game_counter + 5);
lewisgw 21:20478f086bc2 178 // Y is calculated from parabolic relation to game counter.
lewisgw 16:331be5c7ed80 179 }
lewisgw 16:331be5c7ed80 180
lewisgw 5:eda40cdde3e7 181 void Engine::update_lcd(N5110 &lcd){
lewisgw 21:20478f086bc2 182 lcd.drawSprite(_skater_x,_skater_y,17,10,
lewisgw 21:20478f086bc2 183 (int *)_skater.get_sprite(_skater_sprite));
lewisgw 21:20478f086bc2 184 lcd.drawSprite(_coin.get_coin_x(),_coin.get_coin_y(),5,5,
lewisgw 21:20478f086bc2 185 (int*)_coin.get_coin_sprite());
lewisgw 18:304700b5d8f8 186 lcd.drawSprite(_fire.get_fire_x(),_fire_y,5,8,(int*)_fire.get_fire_sprite());
lewisgw 21:20478f086bc2 187 lcd.drawLine(_lower_line_2.x_start,_lower_line_2.y,_lower_line_2.x_end,
lewisgw 21:20478f086bc2 188 _lower_line_2.y,FILL_BLACK);
lewisgw 21:20478f086bc2 189 lcd.drawLine(_lower_line_1.x_start,_lower_line_1.y,_lower_line_1.x_end,
lewisgw 21:20478f086bc2 190 _lower_line_1.y,FILL_BLACK);
lewisgw 21:20478f086bc2 191 lcd.drawLine(_lower_line_3.x_start,_lower_line_3.y,_lower_line_3.x_end,
lewisgw 21:20478f086bc2 192 _lower_line_3.y,FILL_BLACK);
lewisgw 21:20478f086bc2 193 lcd.drawLine(_upper_line_2.x_start,_upper_line_2.y,_upper_line_2.x_end,
lewisgw 21:20478f086bc2 194 _upper_line_2.y,FILL_BLACK);
lewisgw 21:20478f086bc2 195 lcd.drawLine(_upper_line_1.x_start,_upper_line_1.y,_upper_line_1.x_end,
lewisgw 21:20478f086bc2 196 _upper_line_1.y,FILL_BLACK);
lewisgw 21:20478f086bc2 197 lcd.drawLine(_upper_line_3.x_start,_upper_line_3.y,_upper_line_3.x_end,
lewisgw 21:20478f086bc2 198 _upper_line_3.y,FILL_BLACK);
lewisgw 15:876c047a6ec9 199 sprintf(buffer,"%2d",_player_score);
lewisgw 15:876c047a6ec9 200 lcd.printString(buffer,0,0);
lewisgw 11:b66170249a26 201 }
lewisgw 11:b66170249a26 202
lewisgw 21:20478f086bc2 203 bool Engine::get_start_platform_flag() {
lewisgw 21:20478f086bc2 204 if (_input.A_flag) _start_platform_flag = false; // Means starting platform
lewisgw 21:20478f086bc2 205 // will vanish after first jump of the game.
lewisgw 21:20478f086bc2 206 return _start_platform_flag;
lewisgw 15:876c047a6ec9 207 }
lewisgw 15:876c047a6ec9 208
lewisgw 20:a8cad4e044ea 209 void Engine::check_coin_collision(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 210 if (_skater_x == _coin.get_coin_x()
lewisgw 21:20478f086bc2 211 && (_skater_y == _coin.get_coin_y() - 10)) { // Small adjustment for Y
lewisgw 21:20478f086bc2 212 // coord compensates for skater sprite size.
lewisgw 15:876c047a6ec9 213 _coin_collision_flag = true;
lewisgw 15:876c047a6ec9 214 _player_score++;
lewisgw 21:20478f086bc2 215 _coin.set_coin((rand() % 100),(abs(rand() % 100 - 20))); // Place coin
lewisgw 21:20478f086bc2 216 // on a constrained random position
lewisgw 21:20478f086bc2 217 gamepad.tone(1500, 0.05); // Make noise on buzzer.
lewisgw 20:a8cad4e044ea 218 wait(0.05);
lewisgw 20:a8cad4e044ea 219 gamepad.tone(3000, 0.05);
lewisgw 15:876c047a6ec9 220 }
lewisgw 16:331be5c7ed80 221 }
lewisgw 16:331be5c7ed80 222
lewisgw 20:a8cad4e044ea 223 void Engine::check_fire_collision(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 224 if (_input.coord.y > -0.1
lewisgw 21:20478f086bc2 225 && _skater_x == _fire.get_fire_x()
lewisgw 21:20478f086bc2 226 && _skater_y > _fire_y - 10
lewisgw 21:20478f086bc2 227 && _skater_y < _fire_y + 10) { // If skater is not ducking. A range of Y
lewisgw 21:20478f086bc2 228 // coords to make collision more frequent.
lewisgw 17:f377df4ea7b1 229 _skater.set_reset_flag(true);
lewisgw 21:20478f086bc2 230 gamepad.tone(400, 0.25); // Make noise on buzzer.
lewisgw 20:a8cad4e044ea 231 wait(0.05);
lewisgw 20:a8cad4e044ea 232 gamepad.tone(200, 0.25);
lewisgw 21:20478f086bc2 233 } else if ( _skater_x < -10 || _skater_x > 84 ) { // If skater goes off the
lewisgw 21:20478f086bc2 234 // screen.
lewisgw 16:331be5c7ed80 235 _skater.set_reset_flag(true);
lewisgw 20:a8cad4e044ea 236 gamepad.tone(200, 0.5);
lewisgw 16:331be5c7ed80 237 }
lewisgw 16:331be5c7ed80 238 }
lewisgw 17:f377df4ea7b1 239
lewisgw 17:f377df4ea7b1 240 int Engine::get_player_score() {
lewisgw 17:f377df4ea7b1 241 return _player_score;
lewisgw 17:f377df4ea7b1 242 }
lewisgw 16:331be5c7ed80 243