Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Engine/Engine.cpp@27:c920c5ec31af, 2019-05-04 (annotated)
- Committer:
- lewisgw
- Date:
- Sat May 04 13:26:50 2019 +0000
- Revision:
- 27:c920c5ec31af
- Parent:
- 26:4253656c0755
- Child:
- 28:be77ad6c0bda
Updated documentation
Who changed what in which revision?
User | Revision | Line number | New 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 | 26:4253656c0755 | 4 | // [1] "rand" cplusplus. [Online] Available: |
lewisgw | 26:4253656c0755 | 5 | // http://www.cplusplus.com/reference/cstdlib/rand/ [Accessed: 22 April 2019]. |
lewisgw | 23:ff9073e12106 | 6 | |
lewisgw | 21:20478f086bc2 | 7 | // Buffer to print updated score. |
lewisgw | 21:20478f086bc2 | 8 | char buffer[14]; |
lewisgw | 15:876c047a6ec9 | 9 | |
lewisgw | 21:20478f086bc2 | 10 | // Constructor and destructor. |
lewisgw | 9:fff2009f826e | 11 | Engine::Engine() {} |
lewisgw | 5:eda40cdde3e7 | 12 | |
lewisgw | 9:fff2009f826e | 13 | Engine::~Engine() {} |
lewisgw | 5:eda40cdde3e7 | 14 | |
lewisgw | 15:876c047a6ec9 | 15 | void Engine::init() { |
lewisgw | 15:876c047a6ec9 | 16 | reset_skater(); |
lewisgw | 17:f377df4ea7b1 | 17 | reset_engine(); |
lewisgw | 23:ff9073e12106 | 18 | srand(time(NULL)); // Set up for generating random numbers, [1]. |
lewisgw | 15:876c047a6ec9 | 19 | } |
lewisgw | 15:876c047a6ec9 | 20 | |
lewisgw | 20:a8cad4e044ea | 21 | void Engine::check_reset(N5110 &lcd, Gamepad &gamepad) { |
lewisgw | 21:20478f086bc2 | 22 | // If reset flag is true, end and restart the game. |
lewisgw | 9:fff2009f826e | 23 | if (_skater.get_reset_flag()) { |
lewisgw | 26:4253656c0755 | 24 | gamepad.leds_on(); |
lewisgw | 21:20478f086bc2 | 25 | execute_dying_sequence(lcd, gamepad); |
lewisgw | 26:4253656c0755 | 26 | wait(1); // Short pause. |
lewisgw | 20:a8cad4e044ea | 27 | reset_skater(); |
lewisgw | 20:a8cad4e044ea | 28 | reset_engine(); |
lewisgw | 9:fff2009f826e | 29 | } |
lewisgw | 9:fff2009f826e | 30 | } |
lewisgw | 9:fff2009f826e | 31 | |
lewisgw | 21:20478f086bc2 | 32 | void Engine::execute_dying_sequence(N5110 &lcd, Gamepad &gamepad) { |
lewisgw | 26:4253656c0755 | 33 | wait(1); // Short pause. |
lewisgw | 26:4253656c0755 | 34 | gamepad.leds_off(); |
lewisgw | 21:20478f086bc2 | 35 | lcd.clear(); |
lewisgw | 21:20478f086bc2 | 36 | for (int i = 0; i < 40; i = i + 8) { // Counter for y direction, sweeps top |
lewisgw | 21:20478f086bc2 | 37 | // to bottom. |
lewisgw | 23:ff9073e12106 | 38 | for (int j = 0; j < 84; j++) { // Counter for x direction, sweeps L to R. |
lewisgw | 21:20478f086bc2 | 39 | lcd.setPixel(j,i,true); |
lewisgw | 21:20478f086bc2 | 40 | lcd.setPixel(i,j,true); |
lewisgw | 21:20478f086bc2 | 41 | lcd.printString("TRY AGAIN",30,5); |
lewisgw | 21:20478f086bc2 | 42 | lcd.refresh(); |
lewisgw | 27:c920c5ec31af | 43 | gamepad.tone(int(1099 - 15.4*j - 1.2*i), 0.05); // Frequency of tone is |
lewisgw | 26:4253656c0755 | 44 | // dependent on counters. |
lewisgw | 26:4253656c0755 | 45 | wait(0.001); // Control speed of the sequence. |
lewisgw | 21:20478f086bc2 | 46 | sprintf(buffer,"%2d",_player_score); |
lewisgw | 21:20478f086bc2 | 47 | lcd.printString(buffer,0,5); |
lewisgw | 21:20478f086bc2 | 48 | } |
lewisgw | 21:20478f086bc2 | 49 | } |
lewisgw | 21:20478f086bc2 | 50 | } |
lewisgw | 21:20478f086bc2 | 51 | |
lewisgw | 9:fff2009f826e | 52 | void Engine::reset_skater() { |
lewisgw | 18:304700b5d8f8 | 53 | _skater_direction = Left; |
lewisgw | 23:ff9073e12106 | 54 | _start_platform_flag = true; // For printing start text in EngineController. |
lewisgw | 17:f377df4ea7b1 | 55 | _skater.set_reset_flag(false); |
lewisgw | 19:f35887b14c23 | 56 | _moving_counter = 0; |
lewisgw | 26:4253656c0755 | 57 | _jump_counter = 20; // Start game falling onto the platform. |
lewisgw | 19:f35887b14c23 | 58 | _fall_flag = false; |
lewisgw | 17:f377df4ea7b1 | 59 | } |
lewisgw | 17:f377df4ea7b1 | 60 | |
lewisgw | 17:f377df4ea7b1 | 61 | void Engine::reset_engine() { |
lewisgw | 17:f377df4ea7b1 | 62 | _input.coord.x = 0; |
lewisgw | 17:f377df4ea7b1 | 63 | _input.coord.y = 0; |
lewisgw | 17:f377df4ea7b1 | 64 | _input.A_flag = false; |
lewisgw | 21:20478f086bc2 | 65 | _lower_platforms.init(40); // 40 is the platform y coord. |
lewisgw | 21:20478f086bc2 | 66 | _upper_platforms.init(22); // 22 is the platform y coord. |
lewisgw | 17:f377df4ea7b1 | 67 | _coin.init(); |
lewisgw | 18:304700b5d8f8 | 68 | _fire.init(); |
lewisgw | 17:f377df4ea7b1 | 69 | _coin_collision_flag = false; |
lewisgw | 17:f377df4ea7b1 | 70 | _player_score = 0; |
lewisgw | 26:4253656c0755 | 71 | _fire_height = 0; |
lewisgw | 9:fff2009f826e | 72 | } |
lewisgw | 8:5327418f823a | 73 | |
lewisgw | 5:eda40cdde3e7 | 74 | void Engine::read_input(Gamepad &gamepad) { |
lewisgw | 26:4253656c0755 | 75 | // Set up the input struct. |
lewisgw | 9:fff2009f826e | 76 | _input.coord = gamepad.get_mapped_coord(); |
lewisgw | 9:fff2009f826e | 77 | _input.A_flag = gamepad.check_event(Gamepad::A_PRESSED); |
lewisgw | 9:fff2009f826e | 78 | } |
lewisgw | 5:eda40cdde3e7 | 79 | |
lewisgw | 20:a8cad4e044ea | 80 | void Engine::process_y(Gamepad &gamepad) { |
lewisgw | 21:20478f086bc2 | 81 | // Sets the y coord by first checking if the skater should be falling. |
lewisgw | 26:4253656c0755 | 82 | set_fall_flag(); // Update the fall flag dependent on skater position. |
lewisgw | 9:fff2009f826e | 83 | if (_fall_flag) { |
lewisgw | 20:a8cad4e044ea | 84 | _skater.fall(_fall_flag, gamepad); |
lewisgw | 9:fff2009f826e | 85 | } else { |
lewisgw | 21:20478f086bc2 | 86 | _skater.set_y_position( _input.A_flag, _jump_counter, _level_condition, |
lewisgw | 21:20478f086bc2 | 87 | gamepad); |
lewisgw | 9:fff2009f826e | 88 | } |
lewisgw | 21:20478f086bc2 | 89 | _fall_flag = _skater.get_fall_flag(); // Update fall flag. |
lewisgw | 18:304700b5d8f8 | 90 | _skater_y = _skater.get_y_position(); |
lewisgw | 21:20478f086bc2 | 91 | _jump_counter = _skater.get_jump_counter(); // Update jump counter. |
lewisgw | 9:fff2009f826e | 92 | } |
lewisgw | 14:9861fe85c803 | 93 | |
lewisgw | 9:fff2009f826e | 94 | void Engine::set_fall_flag() { |
lewisgw | 21:20478f086bc2 | 95 | // Set the fall flag to true if the skater is not on one of the lower |
lewisgw | 26:4253656c0755 | 96 | // platforms. The start platform condition has been offset by 6 to account for |
lewisgw | 26:4253656c0755 | 97 | // skater sprite size. |
lewisgw | 26:4253656c0755 | 98 | // If the skater is between platform 1 and 2, and on the lower level. |
lewisgw | 21:20478f086bc2 | 99 | if (((_lower_line_1.x_end < _skater_x) |
lewisgw | 21:20478f086bc2 | 100 | && (_skater_x < (_lower_line_2.x_start - 6))) |
lewisgw | 26:4253656c0755 | 101 | && _skater_y == 23) { |
lewisgw | 9:fff2009f826e | 102 | _fall_flag = true; |
lewisgw | 26:4253656c0755 | 103 | // If the skater is between platforms 2 and 3, and on the lower level. |
lewisgw | 21:20478f086bc2 | 104 | } else if (((_lower_line_2.x_end < _skater_x) |
lewisgw | 21:20478f086bc2 | 105 | && (_skater_x < (_lower_line_3.x_start - 6))) |
lewisgw | 21:20478f086bc2 | 106 | && _skater_y == 23) { |
lewisgw | 9:fff2009f826e | 107 | _fall_flag = true; |
lewisgw | 26:4253656c0755 | 108 | // If the skater is between platforms 3 and 1, and on the lower level. |
lewisgw | 21:20478f086bc2 | 109 | } else if (((_lower_line_3.x_end < _skater_x) |
lewisgw | 21:20478f086bc2 | 110 | && (_skater_x < (_lower_line_1.x_start - 6))) |
lewisgw | 21:20478f086bc2 | 111 | && _skater_y == 23) { |
lewisgw | 9:fff2009f826e | 112 | _fall_flag = true; |
lewisgw | 9:fff2009f826e | 113 | } |
lewisgw | 9:fff2009f826e | 114 | } |
lewisgw | 5:eda40cdde3e7 | 115 | |
lewisgw | 17:f377df4ea7b1 | 116 | void Engine::process_x(int game_counter) { |
lewisgw | 21:20478f086bc2 | 117 | // Sets the x coord. |
lewisgw | 17:f377df4ea7b1 | 118 | _skater.set_x_position_and_sprite(_input.coord.x, |
lewisgw | 17:f377df4ea7b1 | 119 | _moving_counter, |
lewisgw | 18:304700b5d8f8 | 120 | _skater_direction, |
lewisgw | 17:f377df4ea7b1 | 121 | _input.coord.y); |
lewisgw | 18:304700b5d8f8 | 122 | _skater_x = _skater.get_x_position(); |
lewisgw | 21:20478f086bc2 | 123 | _moving_counter = _skater.get_moving_counter(); // Update moving counter. |
lewisgw | 26:4253656c0755 | 124 | _speed_divider = int(-0.05*_player_score + 4); // Speed divider is calculated |
lewisgw | 26:4253656c0755 | 125 | // from player score. |
lewisgw | 26:4253656c0755 | 126 | // Move the skater along with platforms at rate determined by speed divider if |
lewisgw | 26:4253656c0755 | 127 | // the skater is not moving left. |
lewisgw | 21:20478f086bc2 | 128 | if ((game_counter % _speed_divider == 0) && (_input.coord.x > -0.1)) { |
lewisgw | 17:f377df4ea7b1 | 129 | _moving_counter--; |
lewisgw | 9:fff2009f826e | 130 | } |
lewisgw | 9:fff2009f826e | 131 | } |
lewisgw | 5:eda40cdde3e7 | 132 | |
lewisgw | 5:eda40cdde3e7 | 133 | void Engine::process_sprite() { |
lewisgw | 14:9861fe85c803 | 134 | // Update the sprite and direction. |
lewisgw | 18:304700b5d8f8 | 135 | _skater_sprite = _skater.get_sprite_value(); |
lewisgw | 18:304700b5d8f8 | 136 | _skater_direction = _skater.get_direction(); |
lewisgw | 9:fff2009f826e | 137 | } |
lewisgw | 5:eda40cdde3e7 | 138 | |
lewisgw | 5:eda40cdde3e7 | 139 | |
lewisgw | 10:8bf3713d9e9c | 140 | void Engine::set_level_condition() { |
lewisgw | 14:9861fe85c803 | 141 | // If the skater is under or on top of any of the upper platforms, set |
lewisgw | 26:4253656c0755 | 142 | // level condition to 1. |
lewisgw | 26:4253656c0755 | 143 | // Offset of 6 is to account for sprite size. |
lewisgw | 26:4253656c0755 | 144 | // If the skater is between start and end of upper platform 1. |
lewisgw | 21:20478f086bc2 | 145 | if (((_upper_line_1.x_start - 6) <= _skater_x) |
lewisgw | 21:20478f086bc2 | 146 | && (_skater_x <= _upper_line_1.x_end)) { |
lewisgw | 10:8bf3713d9e9c | 147 | _level_condition = 1; |
lewisgw | 26:4253656c0755 | 148 | // If the skater is between start and end of upper platform 2. |
lewisgw | 21:20478f086bc2 | 149 | } else if (((_upper_line_2.x_start - 6) <= _skater_x) |
lewisgw | 21:20478f086bc2 | 150 | && (_skater_x <= _upper_line_2.x_end)) { |
lewisgw | 10:8bf3713d9e9c | 151 | _level_condition = 1; |
lewisgw | 26:4253656c0755 | 152 | // If the skater is between start and end of upper platform 3. |
lewisgw | 21:20478f086bc2 | 153 | } else if (((_upper_line_3.x_start - 6) <= _skater_x) |
lewisgw | 21:20478f086bc2 | 154 | && (_skater_x <= _upper_line_3.x_end)) { |
lewisgw | 10:8bf3713d9e9c | 155 | _level_condition = 1; |
lewisgw | 9:fff2009f826e | 156 | } else { |
lewisgw | 10:8bf3713d9e9c | 157 | _level_condition = 0; |
lewisgw | 10:8bf3713d9e9c | 158 | } |
lewisgw | 9:fff2009f826e | 159 | } |
lewisgw | 7:bbc2b75c1418 | 160 | |
lewisgw | 17:f377df4ea7b1 | 161 | void Engine::generate_level(int game_counter) { |
lewisgw | 26:4253656c0755 | 162 | // Generate properties for the level. |
lewisgw | 10:8bf3713d9e9c | 163 | generate_lower_lines(); |
lewisgw | 10:8bf3713d9e9c | 164 | generate_upper_lines(); |
lewisgw | 15:876c047a6ec9 | 165 | _coin.generate_coin(); |
lewisgw | 18:304700b5d8f8 | 166 | generate_fire(game_counter); |
lewisgw | 9:fff2009f826e | 167 | } |
lewisgw | 5:eda40cdde3e7 | 168 | |
lewisgw | 26:4253656c0755 | 169 | void Engine::draw_screen_fire(int game_counter, N5110 &lcd) { |
lewisgw | 26:4253656c0755 | 170 | // Prints the dynamic fire at the bottom of the screen. |
lewisgw | 26:4253656c0755 | 171 | // Restricts the max fire height multiplier, which is dependent on player |
lewisgw | 27:c920c5ec31af | 172 | // score. Fire will start when score = 3. |
lewisgw | 26:4253656c0755 | 173 | if (_player_score < 15) { |
lewisgw | 26:4253656c0755 | 174 | _fire_height = _player_score; |
lewisgw | 26:4253656c0755 | 175 | } else { |
lewisgw | 26:4253656c0755 | 176 | _fire_height = 14; |
lewisgw | 26:4253656c0755 | 177 | } |
lewisgw | 26:4253656c0755 | 178 | // i corresponds to horizontal positions of pixels. |
lewisgw | 26:4253656c0755 | 179 | for (int i = 1; i < 84; i++) { |
lewisgw | 26:4253656c0755 | 180 | if (i % 4 == 0) { |
lewisgw | 26:4253656c0755 | 181 | // j corresponds to vertical height of pixels, and the max height is |
lewisgw | 26:4253656c0755 | 182 | // dependent on game counter (0 to 99) so changes every loop, and is |
lewisgw | 26:4253656c0755 | 183 | // scaled. |
lewisgw | 26:4253656c0755 | 184 | for (int j = 0; j < game_counter*0.01*_fire_height; j++) { |
lewisgw | 26:4253656c0755 | 185 | lcd.setPixel(i + (rand() % 8 + 1) ,50 - j*1.3,true); // Horizontal |
lewisgw | 26:4253656c0755 | 186 | // position of pixel is constrained random [1], multiplier on j varies |
lewisgw | 26:4253656c0755 | 187 | // local height. |
lewisgw | 26:4253656c0755 | 188 | lcd.setPixel(i - (rand() % 8 + 1) ,50 - j*1.2,true); // [1]. |
lewisgw | 26:4253656c0755 | 189 | lcd.setPixel(i - (rand() % 8 + 1) ,50 - j*1.6,true); // [1]. |
lewisgw | 26:4253656c0755 | 190 | lcd.setPixel(i + (rand() % 8 + 1) ,50 - j*1.1,true); // [1]. |
lewisgw | 26:4253656c0755 | 191 | lcd.setPixel(i - (rand() % 8 + 1) ,50 - j*1.4,true); // [1]. |
lewisgw | 26:4253656c0755 | 192 | } |
lewisgw | 26:4253656c0755 | 193 | } |
lewisgw | 26:4253656c0755 | 194 | } |
lewisgw | 26:4253656c0755 | 195 | } |
lewisgw | 26:4253656c0755 | 196 | |
lewisgw | 10:8bf3713d9e9c | 197 | void Engine::generate_lower_lines() { |
lewisgw | 14:9861fe85c803 | 198 | // Use a scaled random number to generate the length of the lower lines. |
lewisgw | 26:4253656c0755 | 199 | _length_1 = (rand() %20) + 10; // [1]. |
lewisgw | 21:20478f086bc2 | 200 | _lower_platforms.set_line_1(_length_1); |
lewisgw | 18:304700b5d8f8 | 201 | _lower_line_1 = _lower_platforms.get_line_1(); |
lewisgw | 26:4253656c0755 | 202 | _length_2 = (rand() %20) + 10; // [1]. |
lewisgw | 21:20478f086bc2 | 203 | _lower_platforms.set_line_2(_length_2); |
lewisgw | 18:304700b5d8f8 | 204 | _lower_line_2 = _lower_platforms.get_line_2(); |
lewisgw | 26:4253656c0755 | 205 | _length_3 = (rand() %20) + 10; // [1]. |
lewisgw | 21:20478f086bc2 | 206 | _lower_platforms.set_line_3(_length_3); |
lewisgw | 18:304700b5d8f8 | 207 | _lower_line_3 = _lower_platforms.get_line_3(); |
lewisgw | 10:8bf3713d9e9c | 208 | } |
lewisgw | 10:8bf3713d9e9c | 209 | |
lewisgw | 10:8bf3713d9e9c | 210 | void Engine::generate_upper_lines() { |
lewisgw | 21:20478f086bc2 | 211 | // Set the length of the upper lines to be proportionally smaller to |
lewisgw | 21:20478f086bc2 | 212 | // the length of the lower lines. |
lewisgw | 21:20478f086bc2 | 213 | _upper_platforms.set_line_1(_length_1 / 2); |
lewisgw | 18:304700b5d8f8 | 214 | _upper_line_1 = _upper_platforms.get_line_1(); |
lewisgw | 21:20478f086bc2 | 215 | _upper_platforms.set_line_2(_length_2 / 2); |
lewisgw | 18:304700b5d8f8 | 216 | _upper_line_2 = _upper_platforms.get_line_2(); |
lewisgw | 21:20478f086bc2 | 217 | _upper_platforms.set_line_3(_length_3 / 2); |
lewisgw | 18:304700b5d8f8 | 218 | _upper_line_3 = _upper_platforms.get_line_3(); |
lewisgw | 10:8bf3713d9e9c | 219 | } |
lewisgw | 5:eda40cdde3e7 | 220 | |
lewisgw | 18:304700b5d8f8 | 221 | void Engine::generate_fire(int game_counter) { |
lewisgw | 21:20478f086bc2 | 222 | // Generates the x and y coordinate of the fire. Y oscillates from 5 to 23. |
lewisgw | 21:20478f086bc2 | 223 | _fire.generate_fire(); // Generates X coord of fire. |
lewisgw | 26:4253656c0755 | 224 | // Y is calculated from parabolic relation to game counter. |
lewisgw | 21:20478f086bc2 | 225 | _fire_y = int(-0.0073*game_counter*game_counter + 0.73*game_counter + 5); |
lewisgw | 16:331be5c7ed80 | 226 | } |
lewisgw | 16:331be5c7ed80 | 227 | |
lewisgw | 26:4253656c0755 | 228 | void Engine::update_lcd(N5110 &lcd, int game_counter){ |
lewisgw | 26:4253656c0755 | 229 | // Draw all sprites, screen fire, platforms and player score. |
lewisgw | 21:20478f086bc2 | 230 | lcd.drawSprite(_skater_x,_skater_y,17,10, |
lewisgw | 21:20478f086bc2 | 231 | (int *)_skater.get_sprite(_skater_sprite)); |
lewisgw | 21:20478f086bc2 | 232 | lcd.drawSprite(_coin.get_coin_x(),_coin.get_coin_y(),5,5, |
lewisgw | 21:20478f086bc2 | 233 | (int*)_coin.get_coin_sprite()); |
lewisgw | 18:304700b5d8f8 | 234 | lcd.drawSprite(_fire.get_fire_x(),_fire_y,5,8,(int*)_fire.get_fire_sprite()); |
lewisgw | 21:20478f086bc2 | 235 | lcd.drawLine(_lower_line_2.x_start,_lower_line_2.y,_lower_line_2.x_end, |
lewisgw | 21:20478f086bc2 | 236 | _lower_line_2.y,FILL_BLACK); |
lewisgw | 21:20478f086bc2 | 237 | lcd.drawLine(_lower_line_1.x_start,_lower_line_1.y,_lower_line_1.x_end, |
lewisgw | 21:20478f086bc2 | 238 | _lower_line_1.y,FILL_BLACK); |
lewisgw | 21:20478f086bc2 | 239 | lcd.drawLine(_lower_line_3.x_start,_lower_line_3.y,_lower_line_3.x_end, |
lewisgw | 21:20478f086bc2 | 240 | _lower_line_3.y,FILL_BLACK); |
lewisgw | 21:20478f086bc2 | 241 | lcd.drawLine(_upper_line_2.x_start,_upper_line_2.y,_upper_line_2.x_end, |
lewisgw | 21:20478f086bc2 | 242 | _upper_line_2.y,FILL_BLACK); |
lewisgw | 21:20478f086bc2 | 243 | lcd.drawLine(_upper_line_1.x_start,_upper_line_1.y,_upper_line_1.x_end, |
lewisgw | 21:20478f086bc2 | 244 | _upper_line_1.y,FILL_BLACK); |
lewisgw | 21:20478f086bc2 | 245 | lcd.drawLine(_upper_line_3.x_start,_upper_line_3.y,_upper_line_3.x_end, |
lewisgw | 21:20478f086bc2 | 246 | _upper_line_3.y,FILL_BLACK); |
lewisgw | 15:876c047a6ec9 | 247 | sprintf(buffer,"%2d",_player_score); |
lewisgw | 15:876c047a6ec9 | 248 | lcd.printString(buffer,0,0); |
lewisgw | 26:4253656c0755 | 249 | draw_screen_fire(game_counter, lcd); |
lewisgw | 11:b66170249a26 | 250 | } |
lewisgw | 11:b66170249a26 | 251 | |
lewisgw | 21:20478f086bc2 | 252 | bool Engine::get_start_platform_flag() { |
lewisgw | 26:4253656c0755 | 253 | if (_input.A_flag) _start_platform_flag = false; // Makes starting platform |
lewisgw | 26:4253656c0755 | 254 | // vanish after first jump of the game. |
lewisgw | 21:20478f086bc2 | 255 | return _start_platform_flag; |
lewisgw | 15:876c047a6ec9 | 256 | } |
lewisgw | 15:876c047a6ec9 | 257 | |
lewisgw | 20:a8cad4e044ea | 258 | void Engine::check_coin_collision(Gamepad &gamepad) { |
lewisgw | 26:4253656c0755 | 259 | // If skater x and y coord matches the coin's. Small adjustment for Y coord |
lewisgw | 26:4253656c0755 | 260 | // compensates for skater sprite size. |
lewisgw | 21:20478f086bc2 | 261 | if (_skater_x == _coin.get_coin_x() |
lewisgw | 26:4253656c0755 | 262 | && (_skater_y == _coin.get_coin_y() - 10)) { |
lewisgw | 15:876c047a6ec9 | 263 | _coin_collision_flag = true; |
lewisgw | 15:876c047a6ec9 | 264 | _player_score++; |
lewisgw | 21:20478f086bc2 | 265 | _coin.set_coin((rand() % 100),(abs(rand() % 100 - 20))); // Place coin |
lewisgw | 23:ff9073e12106 | 266 | // on a constrained random position, [1]. |
lewisgw | 26:4253656c0755 | 267 | gamepad.tone(1500, 0.05); // Make collection noise on buzzer. |
lewisgw | 20:a8cad4e044ea | 268 | wait(0.05); |
lewisgw | 20:a8cad4e044ea | 269 | gamepad.tone(3000, 0.05); |
lewisgw | 15:876c047a6ec9 | 270 | } |
lewisgw | 16:331be5c7ed80 | 271 | } |
lewisgw | 16:331be5c7ed80 | 272 | |
lewisgw | 26:4253656c0755 | 273 | void Engine::check_fire_collision(Gamepad &gamepad, int game_counter) { |
lewisgw | 26:4253656c0755 | 274 | // If skater is not ducking, has same x coord and within a range of y coord |
lewisgw | 26:4253656c0755 | 275 | // as fire. |
lewisgw | 21:20478f086bc2 | 276 | if (_input.coord.y > -0.1 |
lewisgw | 21:20478f086bc2 | 277 | && _skater_x == _fire.get_fire_x() |
lewisgw | 21:20478f086bc2 | 278 | && _skater_y > _fire_y - 10 |
lewisgw | 26:4253656c0755 | 279 | && _skater_y < _fire_y + 10 |
lewisgw | 26:4253656c0755 | 280 | ) { // A range of Y coords to make collision |
lewisgw | 26:4253656c0755 | 281 | // more frequent. |
lewisgw | 17:f377df4ea7b1 | 282 | _skater.set_reset_flag(true); |
lewisgw | 26:4253656c0755 | 283 | gamepad.tone(400, 0.25); // Make collision noise on buzzer. |
lewisgw | 20:a8cad4e044ea | 284 | wait(0.05); |
lewisgw | 20:a8cad4e044ea | 285 | gamepad.tone(200, 0.25); |
lewisgw | 21:20478f086bc2 | 286 | } else if ( _skater_x < -10 || _skater_x > 84 ) { // If skater goes off the |
lewisgw | 21:20478f086bc2 | 287 | // screen. |
lewisgw | 16:331be5c7ed80 | 288 | _skater.set_reset_flag(true); |
lewisgw | 20:a8cad4e044ea | 289 | gamepad.tone(200, 0.5); |
lewisgw | 16:331be5c7ed80 | 290 | } |
lewisgw | 26:4253656c0755 | 291 | // If the skater collides with the scaled peak of the background fire. |
lewisgw | 26:4253656c0755 | 292 | if (_skater_y > (50 - game_counter*_fire_height*0.023)) { |
lewisgw | 26:4253656c0755 | 293 | _fall_flag = true; |
lewisgw | 26:4253656c0755 | 294 | wait(0.05); // Slow down falling sequence. |
lewisgw | 26:4253656c0755 | 295 | } |
lewisgw | 16:331be5c7ed80 | 296 | } |
lewisgw | 17:f377df4ea7b1 | 297 | |
lewisgw | 17:f377df4ea7b1 | 298 | int Engine::get_player_score() { |
lewisgw | 17:f377df4ea7b1 | 299 | return _player_score; |
lewisgw | 17:f377df4ea7b1 | 300 | } |
lewisgw | 16:331be5c7ed80 | 301 |