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@17:f377df4ea7b1, 2019-04-11 (annotated)
- Committer:
- lewisgw
- Date:
- Thu Apr 11 11:37:49 2019 +0000
- Revision:
- 17:f377df4ea7b1
- Parent:
- 16:331be5c7ed80
- Child:
- 18:304700b5d8f8
Ball of fire moves up and down the screen, platforms and ball move faster as you collect more coins to make the game more challenging.
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 | 15:876c047a6ec9 | 3 | char buffer[14]; |
lewisgw | 15:876c047a6ec9 | 4 | |
lewisgw | 14:9861fe85c803 | 5 | // Constructor and destructor |
lewisgw | 9:fff2009f826e | 6 | Engine::Engine() {} |
lewisgw | 5:eda40cdde3e7 | 7 | |
lewisgw | 9:fff2009f826e | 8 | Engine::~Engine() {} |
lewisgw | 5:eda40cdde3e7 | 9 | |
lewisgw | 15:876c047a6ec9 | 10 | void Engine::init() { |
lewisgw | 15:876c047a6ec9 | 11 | // Initialisation of the game. 40 and 22 refer to inital line lengths. |
lewisgw | 15:876c047a6ec9 | 12 | reset_skater(); |
lewisgw | 17:f377df4ea7b1 | 13 | reset_engine(); |
lewisgw | 15:876c047a6ec9 | 14 | srand(time(NULL)); |
lewisgw | 15:876c047a6ec9 | 15 | } |
lewisgw | 15:876c047a6ec9 | 16 | |
lewisgw | 17:f377df4ea7b1 | 17 | void Engine::check_reset(N5110 &lcd) { |
lewisgw | 14:9861fe85c803 | 18 | // Reset the game if the skater has fallen (i.e. reset flag = TRUE). |
lewisgw | 14:9861fe85c803 | 19 | // 40 and 22 refer to the inital lengths of lower and upper platfroms respectivly. |
lewisgw | 9:fff2009f826e | 20 | if (_skater.get_reset_flag()) { |
lewisgw | 9:fff2009f826e | 21 | reset_skater(); |
lewisgw | 17:f377df4ea7b1 | 22 | reset_engine(); |
lewisgw | 17:f377df4ea7b1 | 23 | wait(1); |
lewisgw | 17:f377df4ea7b1 | 24 | lcd.clear(); |
lewisgw | 17:f377df4ea7b1 | 25 | lcd.refresh(); |
lewisgw | 8:5327418f823a | 26 | wait(1); |
lewisgw | 9:fff2009f826e | 27 | } |
lewisgw | 9:fff2009f826e | 28 | } |
lewisgw | 9:fff2009f826e | 29 | |
lewisgw | 9:fff2009f826e | 30 | void Engine::reset_skater() { |
lewisgw | 9:fff2009f826e | 31 | _moving_counter = 0; |
lewisgw | 9:fff2009f826e | 32 | _jump_counter = 0; |
lewisgw | 9:fff2009f826e | 33 | _direction = Left; |
lewisgw | 10:8bf3713d9e9c | 34 | _level_condition = 0; |
lewisgw | 11:b66170249a26 | 35 | _start_platform = true; |
lewisgw | 17:f377df4ea7b1 | 36 | _skater.set_reset_flag(false); |
lewisgw | 17:f377df4ea7b1 | 37 | } |
lewisgw | 17:f377df4ea7b1 | 38 | |
lewisgw | 17:f377df4ea7b1 | 39 | void Engine::reset_engine() { |
lewisgw | 17:f377df4ea7b1 | 40 | _input.coord.x = 0; |
lewisgw | 17:f377df4ea7b1 | 41 | _input.coord.y = 0; |
lewisgw | 17:f377df4ea7b1 | 42 | _input.A_flag = false; |
lewisgw | 17:f377df4ea7b1 | 43 | _lower_map.init(40); |
lewisgw | 17:f377df4ea7b1 | 44 | _upper_map.init(22); |
lewisgw | 17:f377df4ea7b1 | 45 | _coin.init(); |
lewisgw | 17:f377df4ea7b1 | 46 | _spikes.init(); |
lewisgw | 17:f377df4ea7b1 | 47 | _coin_collision_flag = false; |
lewisgw | 17:f377df4ea7b1 | 48 | _player_score = 0; |
lewisgw | 9:fff2009f826e | 49 | } |
lewisgw | 8:5327418f823a | 50 | |
lewisgw | 5:eda40cdde3e7 | 51 | void Engine::read_input(Gamepad &gamepad) { |
lewisgw | 9:fff2009f826e | 52 | _input.coord = gamepad.get_mapped_coord(); |
lewisgw | 9:fff2009f826e | 53 | _input.A_flag = gamepad.check_event(Gamepad::A_PRESSED); |
lewisgw | 9:fff2009f826e | 54 | } |
lewisgw | 5:eda40cdde3e7 | 55 | |
lewisgw | 5:eda40cdde3e7 | 56 | void Engine::process_y() { |
lewisgw | 14:9861fe85c803 | 57 | // Sets the y coordinate by checking if the skater should be falling, and |
lewisgw | 14:9861fe85c803 | 58 | // updating the fall flag and jump counter. |
lewisgw | 9:fff2009f826e | 59 | set_fall_flag(); |
lewisgw | 9:fff2009f826e | 60 | if (_fall_flag) { |
lewisgw | 9:fff2009f826e | 61 | _skater.fall(_fall_flag); |
lewisgw | 9:fff2009f826e | 62 | } else { |
lewisgw | 10:8bf3713d9e9c | 63 | _skater.set_y_position( _input.A_flag, _jump_counter, _level_condition ); |
lewisgw | 9:fff2009f826e | 64 | } |
lewisgw | 9:fff2009f826e | 65 | _fall_flag = _skater.get_fall_flag(); |
lewisgw | 9:fff2009f826e | 66 | _y = _skater.get_y_position(); |
lewisgw | 9:fff2009f826e | 67 | _jump_counter = _skater.get_jump_counter(); |
lewisgw | 9:fff2009f826e | 68 | } |
lewisgw | 14:9861fe85c803 | 69 | |
lewisgw | 9:fff2009f826e | 70 | void Engine::set_fall_flag() { |
lewisgw | 14:9861fe85c803 | 71 | // Set the fall flag to true if the skater is not on one of the platforms. |
lewisgw | 10:8bf3713d9e9c | 72 | if (((_lower_line_1.x_end < _x) && (_x < (_lower_line_2.x_start - 6))) && _y == 23) { |
lewisgw | 9:fff2009f826e | 73 | _fall_flag = true; |
lewisgw | 10:8bf3713d9e9c | 74 | } else if (((_lower_line_2.x_end < _x) && (_x < (_lower_line_3.x_start - 6))) && _y == 23) { |
lewisgw | 9:fff2009f826e | 75 | _fall_flag = true; |
lewisgw | 10:8bf3713d9e9c | 76 | } else if (((_lower_line_3.x_end < _x) && (_x < (_lower_line_1.x_start - 6))) && _y == 23) { |
lewisgw | 9:fff2009f826e | 77 | _fall_flag = true; |
lewisgw | 9:fff2009f826e | 78 | } |
lewisgw | 9:fff2009f826e | 79 | } |
lewisgw | 5:eda40cdde3e7 | 80 | |
lewisgw | 17:f377df4ea7b1 | 81 | void Engine::process_x(int game_counter) { |
lewisgw | 17:f377df4ea7b1 | 82 | // Update x coordinate. |
lewisgw | 14:9861fe85c803 | 83 | // Will move the skater to the left along with the platforms (if he is not moving |
lewisgw | 17:f377df4ea7b1 | 84 | // left already). Speed divider is dependent on the number of coins you have, more coins |
lewisgw | 17:f377df4ea7b1 | 85 | // means moves faster. |
lewisgw | 17:f377df4ea7b1 | 86 | _skater.set_x_position_and_sprite(_input.coord.x, |
lewisgw | 17:f377df4ea7b1 | 87 | _moving_counter, |
lewisgw | 17:f377df4ea7b1 | 88 | _direction, |
lewisgw | 17:f377df4ea7b1 | 89 | _input.coord.y); |
lewisgw | 17:f377df4ea7b1 | 90 | _x = _skater.get_x_position(); |
lewisgw | 17:f377df4ea7b1 | 91 | _moving_counter = _skater.get_moving_counter(); |
lewisgw | 17:f377df4ea7b1 | 92 | _speed_divider = int(-0.05*_player_score + 4); |
lewisgw | 17:f377df4ea7b1 | 93 | if ((game_counter % _speed_divider == 0) && (_input.coord.x > -0.1)) { |
lewisgw | 17:f377df4ea7b1 | 94 | _moving_counter--; |
lewisgw | 9:fff2009f826e | 95 | } |
lewisgw | 9:fff2009f826e | 96 | } |
lewisgw | 5:eda40cdde3e7 | 97 | |
lewisgw | 5:eda40cdde3e7 | 98 | void Engine::process_sprite() { |
lewisgw | 14:9861fe85c803 | 99 | // Update the sprite and direction. |
lewisgw | 9:fff2009f826e | 100 | _sprite = _skater.get_sprite_value(); |
lewisgw | 9:fff2009f826e | 101 | _direction = _skater.get_direction(); |
lewisgw | 9:fff2009f826e | 102 | } |
lewisgw | 5:eda40cdde3e7 | 103 | |
lewisgw | 5:eda40cdde3e7 | 104 | |
lewisgw | 10:8bf3713d9e9c | 105 | void Engine::set_level_condition() { |
lewisgw | 14:9861fe85c803 | 106 | // If the skater is under or on top of any of the upper platforms, set |
lewisgw | 14:9861fe85c803 | 107 | // level condition to 1. |
lewisgw | 10:8bf3713d9e9c | 108 | if (((_upper_line_1.x_start - 6) <= _x) && (_x <= _upper_line_1.x_end)) { |
lewisgw | 10:8bf3713d9e9c | 109 | _level_condition = 1; |
lewisgw | 10:8bf3713d9e9c | 110 | } else if (((_upper_line_2.x_start - 6) <= _x) && (_x <= _upper_line_2.x_end)) { |
lewisgw | 10:8bf3713d9e9c | 111 | _level_condition = 1; |
lewisgw | 10:8bf3713d9e9c | 112 | } else if (((_upper_line_3.x_start - 6) <= _x) && (_x <= _upper_line_3.x_end)) { |
lewisgw | 10:8bf3713d9e9c | 113 | _level_condition = 1; |
lewisgw | 9:fff2009f826e | 114 | } else { |
lewisgw | 10:8bf3713d9e9c | 115 | _level_condition = 0; |
lewisgw | 10:8bf3713d9e9c | 116 | } |
lewisgw | 9:fff2009f826e | 117 | } |
lewisgw | 7:bbc2b75c1418 | 118 | |
lewisgw | 17:f377df4ea7b1 | 119 | void Engine::generate_level(int game_counter) { |
lewisgw | 16:331be5c7ed80 | 120 | // Generate parameters for all objects in the level (except skater) |
lewisgw | 10:8bf3713d9e9c | 121 | generate_lower_lines(); |
lewisgw | 10:8bf3713d9e9c | 122 | generate_upper_lines(); |
lewisgw | 15:876c047a6ec9 | 123 | _coin.generate_coin(); |
lewisgw | 17:f377df4ea7b1 | 124 | generate_spikes(game_counter); |
lewisgw | 9:fff2009f826e | 125 | } |
lewisgw | 5:eda40cdde3e7 | 126 | |
lewisgw | 10:8bf3713d9e9c | 127 | void Engine::generate_lower_lines() { |
lewisgw | 14:9861fe85c803 | 128 | // Use a scaled random number to generate the length of the lower lines. |
lewisgw | 10:8bf3713d9e9c | 129 | _length_1 = (rand() %20) + 10; |
lewisgw | 10:8bf3713d9e9c | 130 | _lower_map.generate_line_1(_length_1); |
lewisgw | 10:8bf3713d9e9c | 131 | _lower_line_1 = _lower_map.get_line_1(); |
lewisgw | 10:8bf3713d9e9c | 132 | _length_2 = (rand() %20) + 10; |
lewisgw | 10:8bf3713d9e9c | 133 | _lower_map.generate_line_2(_length_2); |
lewisgw | 10:8bf3713d9e9c | 134 | _lower_line_2 = _lower_map.get_line_2(); |
lewisgw | 10:8bf3713d9e9c | 135 | _length_3 = (rand() %20) + 10; |
lewisgw | 10:8bf3713d9e9c | 136 | _lower_map.generate_line_3(_length_3); |
lewisgw | 10:8bf3713d9e9c | 137 | _lower_line_3 = _lower_map.get_line_3(); |
lewisgw | 10:8bf3713d9e9c | 138 | } |
lewisgw | 10:8bf3713d9e9c | 139 | |
lewisgw | 10:8bf3713d9e9c | 140 | void Engine::generate_upper_lines() { |
lewisgw | 14:9861fe85c803 | 141 | // Set the length of the lower lines to be proportionally smaller to |
lewisgw | 14:9861fe85c803 | 142 | // the length of the upper lines. |
lewisgw | 10:8bf3713d9e9c | 143 | _upper_map.generate_line_1(_length_1 / 2); |
lewisgw | 10:8bf3713d9e9c | 144 | _upper_line_1 = _upper_map.get_line_1(); |
lewisgw | 10:8bf3713d9e9c | 145 | _upper_map.generate_line_2(_length_2 / 2); |
lewisgw | 10:8bf3713d9e9c | 146 | _upper_line_2 = _upper_map.get_line_2(); |
lewisgw | 10:8bf3713d9e9c | 147 | _upper_map.generate_line_3(_length_3 / 2); |
lewisgw | 10:8bf3713d9e9c | 148 | _upper_line_3 = _upper_map.get_line_3(); |
lewisgw | 10:8bf3713d9e9c | 149 | } |
lewisgw | 5:eda40cdde3e7 | 150 | |
lewisgw | 17:f377df4ea7b1 | 151 | void Engine::generate_spikes(int game_counter) { |
lewisgw | 16:331be5c7ed80 | 152 | _spikes.update_spikes(); |
lewisgw | 17:f377df4ea7b1 | 153 | _spikes_y = int(float(-0.0089*game_counter*game_counter) + (0.8*game_counter) + 5); |
lewisgw | 16:331be5c7ed80 | 154 | } |
lewisgw | 16:331be5c7ed80 | 155 | |
lewisgw | 5:eda40cdde3e7 | 156 | void Engine::update_lcd(N5110 &lcd){ |
lewisgw | 15:876c047a6ec9 | 157 | lcd.drawSprite(_x,_y,17,10,(int *)_skater.get_sprite(_sprite)); |
lewisgw | 16:331be5c7ed80 | 158 | lcd.drawSprite(_coin.get_coin_x(),_coin.get_coin_y(),5,5,(int*)_coin.get_coin_sprite()); |
lewisgw | 17:f377df4ea7b1 | 159 | lcd.drawSprite(_spikes.get_spikes_x(),_spikes_y,5,8,(int*)_spikes.get_spikes_sprite()); |
lewisgw | 10:8bf3713d9e9c | 160 | lcd.drawLine(_lower_line_2.x_start,_lower_line_2.y,_lower_line_2.x_end,_lower_line_2.y,FILL_BLACK); |
lewisgw | 10:8bf3713d9e9c | 161 | lcd.drawLine(_lower_line_1.x_start,_lower_line_1.y,_lower_line_1.x_end,_lower_line_1.y,FILL_BLACK); |
lewisgw | 10:8bf3713d9e9c | 162 | lcd.drawLine(_lower_line_3.x_start,_lower_line_3.y,_lower_line_3.x_end,_lower_line_3.y,FILL_BLACK); |
lewisgw | 10:8bf3713d9e9c | 163 | lcd.drawLine(_upper_line_2.x_start,_upper_line_2.y,_upper_line_2.x_end,_upper_line_2.y,FILL_BLACK); |
lewisgw | 10:8bf3713d9e9c | 164 | lcd.drawLine(_upper_line_1.x_start,_upper_line_1.y,_upper_line_1.x_end,_upper_line_1.y,FILL_BLACK); |
lewisgw | 10:8bf3713d9e9c | 165 | lcd.drawLine(_upper_line_3.x_start,_upper_line_3.y,_upper_line_3.x_end,_upper_line_3.y,FILL_BLACK); |
lewisgw | 15:876c047a6ec9 | 166 | sprintf(buffer,"%2d",_player_score); |
lewisgw | 15:876c047a6ec9 | 167 | lcd.printString(buffer,0,0); |
lewisgw | 11:b66170249a26 | 168 | } |
lewisgw | 11:b66170249a26 | 169 | |
lewisgw | 11:b66170249a26 | 170 | bool Engine::get_start_platform() { |
lewisgw | 14:9861fe85c803 | 171 | // Set start platform flag to be false if the button A is pressed |
lewisgw | 14:9861fe85c803 | 172 | // (so the starting text goes away after the first jump). |
lewisgw | 11:b66170249a26 | 173 | if(_input.A_flag) _start_platform = false; |
lewisgw | 11:b66170249a26 | 174 | return _start_platform; |
lewisgw | 15:876c047a6ec9 | 175 | } |
lewisgw | 15:876c047a6ec9 | 176 | |
lewisgw | 15:876c047a6ec9 | 177 | void Engine::check_coin_collision() { |
lewisgw | 16:331be5c7ed80 | 178 | // If the skater coords match the coins, add 1 to the players score and print |
lewisgw | 16:331be5c7ed80 | 179 | // a new coin in a random position |
lewisgw | 16:331be5c7ed80 | 180 | if (_x == _coin.get_coin_x() && (_y == _coin.get_coin_y() - 10)) { |
lewisgw | 15:876c047a6ec9 | 181 | _coin_collision_flag = true; |
lewisgw | 15:876c047a6ec9 | 182 | _player_score++; |
lewisgw | 15:876c047a6ec9 | 183 | _coin.update_coin((rand() % 100),(abs(rand() % 100 - 20))); |
lewisgw | 15:876c047a6ec9 | 184 | } |
lewisgw | 16:331be5c7ed80 | 185 | } |
lewisgw | 16:331be5c7ed80 | 186 | |
lewisgw | 16:331be5c7ed80 | 187 | void Engine::check_spikes_collision() { |
lewisgw | 16:331be5c7ed80 | 188 | // If the skaters coord match the spikes and he is not ducking, the player has died |
lewisgw | 17:f377df4ea7b1 | 189 | // and the game is reset. Game will also reset if skater goes off the screen. |
lewisgw | 17:f377df4ea7b1 | 190 | if (_input.coord.y > -0.1 && _x == _spikes.get_spikes_x() && _spikes_y - 1 < _y < _spikes_y + 1) { |
lewisgw | 17:f377df4ea7b1 | 191 | _skater.set_reset_flag(true); |
lewisgw | 17:f377df4ea7b1 | 192 | } else if ( _x < -10 || _x > 84 ) { |
lewisgw | 16:331be5c7ed80 | 193 | _skater.set_reset_flag(true); |
lewisgw | 16:331be5c7ed80 | 194 | } |
lewisgw | 16:331be5c7ed80 | 195 | } |
lewisgw | 17:f377df4ea7b1 | 196 | |
lewisgw | 17:f377df4ea7b1 | 197 | int Engine::get_player_score() { |
lewisgw | 17:f377df4ea7b1 | 198 | return _player_score; |
lewisgw | 17:f377df4ea7b1 | 199 | } |
lewisgw | 16:331be5c7ed80 | 200 |