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@26:4253656c0755, 2019-05-03 (annotated)
- Committer:
- lewisgw
- Date:
- Fri May 03 09:33:34 2019 +0000
- Revision:
- 26:4253656c0755
- Parent:
- 23:ff9073e12106
- Child:
- 27:c920c5ec31af
Now a dynamic fire at the bottom of the screen that gets higher as the player collects more coins. It will kill the skater if they collide.
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 | 21:20478f086bc2 | 43 | gamepad.tone(int(1099 - 15.4*j - 1.2*i), 0.05); // Frequnecy 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 | 26:4253656c0755 | 172 | // score. |
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 |