ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

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?

UserRevisionLine numberNew 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