ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Mon Apr 15 18:49:35 2019 +0000
Revision:
19:f35887b14c23
Parent:
18:304700b5d8f8
Child:
20:a8cad4e044ea
Minor bug fixes, furnished the menus and created a pixel dying sequence.

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 19:f35887b14c23 25 for (int i = 0; i < 40; i = i + 8) {
lewisgw 19:f35887b14c23 26 for (int j = 0; j < 84; j++) {
lewisgw 19:f35887b14c23 27 lcd.setPixel(j,i,true);
lewisgw 19:f35887b14c23 28 lcd.setPixel(i,j,true);
lewisgw 19:f35887b14c23 29 lcd.printString("TRY AGAIN",30,5);
lewisgw 19:f35887b14c23 30 lcd.refresh();
lewisgw 19:f35887b14c23 31 wait(0.001);
lewisgw 19:f35887b14c23 32 }
lewisgw 19:f35887b14c23 33 }
lewisgw 8:5327418f823a 34 wait(1);
lewisgw 9:fff2009f826e 35 }
lewisgw 9:fff2009f826e 36 }
lewisgw 9:fff2009f826e 37
lewisgw 9:fff2009f826e 38 void Engine::reset_skater() {
lewisgw 18:304700b5d8f8 39 _skater_direction = Left;
lewisgw 11:b66170249a26 40 _start_platform = true;
lewisgw 17:f377df4ea7b1 41 _skater.set_reset_flag(false);
lewisgw 19:f35887b14c23 42 _moving_counter = 0;
lewisgw 19:f35887b14c23 43 _jump_counter = 20;
lewisgw 19:f35887b14c23 44 _fall_flag = false;
lewisgw 17:f377df4ea7b1 45 }
lewisgw 17:f377df4ea7b1 46
lewisgw 17:f377df4ea7b1 47 void Engine::reset_engine() {
lewisgw 17:f377df4ea7b1 48 _input.coord.x = 0;
lewisgw 17:f377df4ea7b1 49 _input.coord.y = 0;
lewisgw 17:f377df4ea7b1 50 _input.A_flag = false;
lewisgw 18:304700b5d8f8 51 _lower_platforms.init(40);
lewisgw 18:304700b5d8f8 52 _upper_platforms.init(22);
lewisgw 17:f377df4ea7b1 53 _coin.init();
lewisgw 18:304700b5d8f8 54 _fire.init();
lewisgw 17:f377df4ea7b1 55 _coin_collision_flag = false;
lewisgw 17:f377df4ea7b1 56 _player_score = 0;
lewisgw 9:fff2009f826e 57 }
lewisgw 8:5327418f823a 58
lewisgw 5:eda40cdde3e7 59 void Engine::read_input(Gamepad &gamepad) {
lewisgw 9:fff2009f826e 60 _input.coord = gamepad.get_mapped_coord();
lewisgw 9:fff2009f826e 61 _input.A_flag = gamepad.check_event(Gamepad::A_PRESSED);
lewisgw 9:fff2009f826e 62 }
lewisgw 5:eda40cdde3e7 63
lewisgw 5:eda40cdde3e7 64 void Engine::process_y() {
lewisgw 14:9861fe85c803 65 // Sets the y coordinate by checking if the skater should be falling, and
lewisgw 14:9861fe85c803 66 // updating the fall flag and jump counter.
lewisgw 9:fff2009f826e 67 set_fall_flag();
lewisgw 9:fff2009f826e 68 if (_fall_flag) {
lewisgw 9:fff2009f826e 69 _skater.fall(_fall_flag);
lewisgw 9:fff2009f826e 70 } else {
lewisgw 10:8bf3713d9e9c 71 _skater.set_y_position( _input.A_flag, _jump_counter, _level_condition );
lewisgw 9:fff2009f826e 72 }
lewisgw 9:fff2009f826e 73 _fall_flag = _skater.get_fall_flag();
lewisgw 18:304700b5d8f8 74 _skater_y = _skater.get_y_position();
lewisgw 9:fff2009f826e 75 _jump_counter = _skater.get_jump_counter();
lewisgw 9:fff2009f826e 76 }
lewisgw 14:9861fe85c803 77
lewisgw 9:fff2009f826e 78 void Engine::set_fall_flag() {
lewisgw 14:9861fe85c803 79 // Set the fall flag to true if the skater is not on one of the platforms.
lewisgw 18:304700b5d8f8 80 if (((_lower_line_1.x_end < _skater_x) && (_skater_x < (_lower_line_2.x_start - 6))) && _skater_y == 23) {
lewisgw 9:fff2009f826e 81 _fall_flag = true;
lewisgw 18:304700b5d8f8 82 } else if (((_lower_line_2.x_end < _skater_x) && (_skater_x < (_lower_line_3.x_start - 6))) && _skater_y == 23) {
lewisgw 9:fff2009f826e 83 _fall_flag = true;
lewisgw 18:304700b5d8f8 84 } else if (((_lower_line_3.x_end < _skater_x) && (_skater_x < (_lower_line_1.x_start - 6))) && _skater_y == 23) {
lewisgw 9:fff2009f826e 85 _fall_flag = true;
lewisgw 9:fff2009f826e 86 }
lewisgw 9:fff2009f826e 87 }
lewisgw 5:eda40cdde3e7 88
lewisgw 17:f377df4ea7b1 89 void Engine::process_x(int game_counter) {
lewisgw 17:f377df4ea7b1 90 // Update x coordinate.
lewisgw 14:9861fe85c803 91 // Will move the skater to the left along with the platforms (if he is not moving
lewisgw 17:f377df4ea7b1 92 // left already). Speed divider is dependent on the number of coins you have, more coins
lewisgw 17:f377df4ea7b1 93 // means moves faster.
lewisgw 17:f377df4ea7b1 94 _skater.set_x_position_and_sprite(_input.coord.x,
lewisgw 17:f377df4ea7b1 95 _moving_counter,
lewisgw 18:304700b5d8f8 96 _skater_direction,
lewisgw 17:f377df4ea7b1 97 _input.coord.y);
lewisgw 18:304700b5d8f8 98 _skater_x = _skater.get_x_position();
lewisgw 17:f377df4ea7b1 99 _moving_counter = _skater.get_moving_counter();
lewisgw 17:f377df4ea7b1 100 _speed_divider = int(-0.05*_player_score + 4);
lewisgw 17:f377df4ea7b1 101 if ((game_counter % _speed_divider == 0) && (_input.coord.x > -0.1)) {
lewisgw 17:f377df4ea7b1 102 _moving_counter--;
lewisgw 9:fff2009f826e 103 }
lewisgw 9:fff2009f826e 104 }
lewisgw 5:eda40cdde3e7 105
lewisgw 5:eda40cdde3e7 106 void Engine::process_sprite() {
lewisgw 14:9861fe85c803 107 // Update the sprite and direction.
lewisgw 18:304700b5d8f8 108 _skater_sprite = _skater.get_sprite_value();
lewisgw 18:304700b5d8f8 109 _skater_direction = _skater.get_direction();
lewisgw 9:fff2009f826e 110 }
lewisgw 5:eda40cdde3e7 111
lewisgw 5:eda40cdde3e7 112
lewisgw 10:8bf3713d9e9c 113 void Engine::set_level_condition() {
lewisgw 14:9861fe85c803 114 // If the skater is under or on top of any of the upper platforms, set
lewisgw 14:9861fe85c803 115 // level condition to 1.
lewisgw 18:304700b5d8f8 116 if (((_upper_line_1.x_start - 6) <= _skater_x) && (_skater_x <= _upper_line_1.x_end)) {
lewisgw 10:8bf3713d9e9c 117 _level_condition = 1;
lewisgw 18:304700b5d8f8 118 } else if (((_upper_line_2.x_start - 6) <= _skater_x) && (_skater_x <= _upper_line_2.x_end)) {
lewisgw 10:8bf3713d9e9c 119 _level_condition = 1;
lewisgw 18:304700b5d8f8 120 } else if (((_upper_line_3.x_start - 6) <= _skater_x) && (_skater_x <= _upper_line_3.x_end)) {
lewisgw 10:8bf3713d9e9c 121 _level_condition = 1;
lewisgw 9:fff2009f826e 122 } else {
lewisgw 10:8bf3713d9e9c 123 _level_condition = 0;
lewisgw 10:8bf3713d9e9c 124 }
lewisgw 9:fff2009f826e 125 }
lewisgw 7:bbc2b75c1418 126
lewisgw 17:f377df4ea7b1 127 void Engine::generate_level(int game_counter) {
lewisgw 16:331be5c7ed80 128 // Generate parameters for all objects in the level (except skater)
lewisgw 10:8bf3713d9e9c 129 generate_lower_lines();
lewisgw 10:8bf3713d9e9c 130 generate_upper_lines();
lewisgw 15:876c047a6ec9 131 _coin.generate_coin();
lewisgw 18:304700b5d8f8 132 generate_fire(game_counter);
lewisgw 9:fff2009f826e 133 }
lewisgw 5:eda40cdde3e7 134
lewisgw 10:8bf3713d9e9c 135 void Engine::generate_lower_lines() {
lewisgw 14:9861fe85c803 136 // Use a scaled random number to generate the length of the lower lines.
lewisgw 10:8bf3713d9e9c 137 _length_1 = (rand() %20) + 10;
lewisgw 18:304700b5d8f8 138 _lower_platforms.generate_line_1(_length_1);
lewisgw 18:304700b5d8f8 139 _lower_line_1 = _lower_platforms.get_line_1();
lewisgw 10:8bf3713d9e9c 140 _length_2 = (rand() %20) + 10;
lewisgw 18:304700b5d8f8 141 _lower_platforms.generate_line_2(_length_2);
lewisgw 18:304700b5d8f8 142 _lower_line_2 = _lower_platforms.get_line_2();
lewisgw 10:8bf3713d9e9c 143 _length_3 = (rand() %20) + 10;
lewisgw 18:304700b5d8f8 144 _lower_platforms.generate_line_3(_length_3);
lewisgw 18:304700b5d8f8 145 _lower_line_3 = _lower_platforms.get_line_3();
lewisgw 10:8bf3713d9e9c 146 }
lewisgw 10:8bf3713d9e9c 147
lewisgw 10:8bf3713d9e9c 148 void Engine::generate_upper_lines() {
lewisgw 14:9861fe85c803 149 // Set the length of the lower lines to be proportionally smaller to
lewisgw 14:9861fe85c803 150 // the length of the upper lines.
lewisgw 18:304700b5d8f8 151 _upper_platforms.generate_line_1(_length_1 / 2);
lewisgw 18:304700b5d8f8 152 _upper_line_1 = _upper_platforms.get_line_1();
lewisgw 18:304700b5d8f8 153 _upper_platforms.generate_line_2(_length_2 / 2);
lewisgw 18:304700b5d8f8 154 _upper_line_2 = _upper_platforms.get_line_2();
lewisgw 18:304700b5d8f8 155 _upper_platforms.generate_line_3(_length_3 / 2);
lewisgw 18:304700b5d8f8 156 _upper_line_3 = _upper_platforms.get_line_3();
lewisgw 10:8bf3713d9e9c 157 }
lewisgw 5:eda40cdde3e7 158
lewisgw 18:304700b5d8f8 159 void Engine::generate_fire(int game_counter) {
lewisgw 18:304700b5d8f8 160 // Generate the x and y coordinate of the fire. X is from the fire class method and
lewisgw 18:304700b5d8f8 161 // y is claculated from a quadratic expression that oscilates from 5 to 23 with the
lewisgw 19:f35887b14c23 162 // game counter going from 0 to 99 periodicly as its input.
lewisgw 18:304700b5d8f8 163 _fire.update_fire();
lewisgw 19:f35887b14c23 164 _fire_y = int(-0.0073*game_counter*game_counter + 0.73*game_counter + 5);
lewisgw 16:331be5c7ed80 165 }
lewisgw 16:331be5c7ed80 166
lewisgw 5:eda40cdde3e7 167 void Engine::update_lcd(N5110 &lcd){
lewisgw 18:304700b5d8f8 168 lcd.drawSprite(_skater_x,_skater_y,17,10,(int *)_skater.get_sprite(_skater_sprite));
lewisgw 16:331be5c7ed80 169 lcd.drawSprite(_coin.get_coin_x(),_coin.get_coin_y(),5,5,(int*)_coin.get_coin_sprite());
lewisgw 18:304700b5d8f8 170 lcd.drawSprite(_fire.get_fire_x(),_fire_y,5,8,(int*)_fire.get_fire_sprite());
lewisgw 10:8bf3713d9e9c 171 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 172 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 173 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 174 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 175 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 176 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 177 sprintf(buffer,"%2d",_player_score);
lewisgw 15:876c047a6ec9 178 lcd.printString(buffer,0,0);
lewisgw 11:b66170249a26 179 }
lewisgw 11:b66170249a26 180
lewisgw 11:b66170249a26 181 bool Engine::get_start_platform() {
lewisgw 14:9861fe85c803 182 // Set start platform flag to be false if the button A is pressed
lewisgw 14:9861fe85c803 183 // (so the starting text goes away after the first jump).
lewisgw 11:b66170249a26 184 if(_input.A_flag) _start_platform = false;
lewisgw 11:b66170249a26 185 return _start_platform;
lewisgw 15:876c047a6ec9 186 }
lewisgw 15:876c047a6ec9 187
lewisgw 15:876c047a6ec9 188 void Engine::check_coin_collision() {
lewisgw 16:331be5c7ed80 189 // If the skater coords match the coins, add 1 to the players score and print
lewisgw 16:331be5c7ed80 190 // a new coin in a random position
lewisgw 18:304700b5d8f8 191 if (_skater_x == _coin.get_coin_x() && (_skater_y == _coin.get_coin_y() - 10)) {
lewisgw 15:876c047a6ec9 192 _coin_collision_flag = true;
lewisgw 15:876c047a6ec9 193 _player_score++;
lewisgw 15:876c047a6ec9 194 _coin.update_coin((rand() % 100),(abs(rand() % 100 - 20)));
lewisgw 15:876c047a6ec9 195 }
lewisgw 16:331be5c7ed80 196 }
lewisgw 16:331be5c7ed80 197
lewisgw 18:304700b5d8f8 198 void Engine::check_fire_collision() {
lewisgw 18:304700b5d8f8 199 // If the skaters coord match the fire and he is not ducking, the player has died
lewisgw 17:f377df4ea7b1 200 // and the game is reset. Game will also reset if skater goes off the screen.
lewisgw 19:f35887b14c23 201 if (_input.coord.y > -0.1 && _skater_x == _fire.get_fire_x() && _skater_y > _fire_y - 10 && _skater_y < _fire_y + 10) {
lewisgw 17:f377df4ea7b1 202 _skater.set_reset_flag(true);
lewisgw 18:304700b5d8f8 203 } else if ( _skater_x < -10 || _skater_x > 84 ) {
lewisgw 16:331be5c7ed80 204 _skater.set_reset_flag(true);
lewisgw 16:331be5c7ed80 205 }
lewisgw 16:331be5c7ed80 206 }
lewisgw 17:f377df4ea7b1 207
lewisgw 17:f377df4ea7b1 208 int Engine::get_player_score() {
lewisgw 17:f377df4ea7b1 209 return _player_score;
lewisgw 17:f377df4ea7b1 210 }
lewisgw 16:331be5c7ed80 211