ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Mon Apr 22 16:33:29 2019 +0000
Revision:
23:ff9073e12106
Parent:
21:20478f086bc2
Child:
26:4253656c0755
Included referencing.;

Who changed what in which revision?

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