ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Fri Apr 12 11:30:25 2019 +0000
Revision:
18:304700b5d8f8
Parent:
17:f377df4ea7b1
Child:
19:f35887b14c23
Added a large menu artwork and re-named variables and functions to make the code more readable

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 18:304700b5d8f8 33 _skater_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 18:304700b5d8f8 43 _lower_platforms.init(40);
lewisgw 18:304700b5d8f8 44 _upper_platforms.init(22);
lewisgw 17:f377df4ea7b1 45 _coin.init();
lewisgw 18:304700b5d8f8 46 _fire.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 18:304700b5d8f8 66 _skater_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 18:304700b5d8f8 72 if (((_lower_line_1.x_end < _skater_x) && (_skater_x < (_lower_line_2.x_start - 6))) && _skater_y == 23) {
lewisgw 9:fff2009f826e 73 _fall_flag = true;
lewisgw 18:304700b5d8f8 74 } else if (((_lower_line_2.x_end < _skater_x) && (_skater_x < (_lower_line_3.x_start - 6))) && _skater_y == 23) {
lewisgw 9:fff2009f826e 75 _fall_flag = true;
lewisgw 18:304700b5d8f8 76 } else if (((_lower_line_3.x_end < _skater_x) && (_skater_x < (_lower_line_1.x_start - 6))) && _skater_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 18:304700b5d8f8 88 _skater_direction,
lewisgw 17:f377df4ea7b1 89 _input.coord.y);
lewisgw 18:304700b5d8f8 90 _skater_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 18:304700b5d8f8 100 _skater_sprite = _skater.get_sprite_value();
lewisgw 18:304700b5d8f8 101 _skater_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 18:304700b5d8f8 108 if (((_upper_line_1.x_start - 6) <= _skater_x) && (_skater_x <= _upper_line_1.x_end)) {
lewisgw 10:8bf3713d9e9c 109 _level_condition = 1;
lewisgw 18:304700b5d8f8 110 } else if (((_upper_line_2.x_start - 6) <= _skater_x) && (_skater_x <= _upper_line_2.x_end)) {
lewisgw 10:8bf3713d9e9c 111 _level_condition = 1;
lewisgw 18:304700b5d8f8 112 } else if (((_upper_line_3.x_start - 6) <= _skater_x) && (_skater_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 18:304700b5d8f8 124 generate_fire(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 18:304700b5d8f8 130 _lower_platforms.generate_line_1(_length_1);
lewisgw 18:304700b5d8f8 131 _lower_line_1 = _lower_platforms.get_line_1();
lewisgw 10:8bf3713d9e9c 132 _length_2 = (rand() %20) + 10;
lewisgw 18:304700b5d8f8 133 _lower_platforms.generate_line_2(_length_2);
lewisgw 18:304700b5d8f8 134 _lower_line_2 = _lower_platforms.get_line_2();
lewisgw 10:8bf3713d9e9c 135 _length_3 = (rand() %20) + 10;
lewisgw 18:304700b5d8f8 136 _lower_platforms.generate_line_3(_length_3);
lewisgw 18:304700b5d8f8 137 _lower_line_3 = _lower_platforms.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 18:304700b5d8f8 143 _upper_platforms.generate_line_1(_length_1 / 2);
lewisgw 18:304700b5d8f8 144 _upper_line_1 = _upper_platforms.get_line_1();
lewisgw 18:304700b5d8f8 145 _upper_platforms.generate_line_2(_length_2 / 2);
lewisgw 18:304700b5d8f8 146 _upper_line_2 = _upper_platforms.get_line_2();
lewisgw 18:304700b5d8f8 147 _upper_platforms.generate_line_3(_length_3 / 2);
lewisgw 18:304700b5d8f8 148 _upper_line_3 = _upper_platforms.get_line_3();
lewisgw 10:8bf3713d9e9c 149 }
lewisgw 5:eda40cdde3e7 150
lewisgw 18:304700b5d8f8 151 void Engine::generate_fire(int game_counter) {
lewisgw 18:304700b5d8f8 152 // Generate the x and y coordinate of the fire. X is from the fire class method and
lewisgw 18:304700b5d8f8 153 // y is claculated from a quadratic expression that oscilates from 5 to 23 with the
lewisgw 18:304700b5d8f8 154 // game counter going from 0 to 90 periodicly as its input.
lewisgw 18:304700b5d8f8 155 _fire.update_fire();
lewisgw 18:304700b5d8f8 156 _fire_y = int(float(-0.0089*game_counter*game_counter) + (0.8*game_counter) + 5);
lewisgw 16:331be5c7ed80 157 }
lewisgw 16:331be5c7ed80 158
lewisgw 5:eda40cdde3e7 159 void Engine::update_lcd(N5110 &lcd){
lewisgw 18:304700b5d8f8 160 lcd.drawSprite(_skater_x,_skater_y,17,10,(int *)_skater.get_sprite(_skater_sprite));
lewisgw 16:331be5c7ed80 161 lcd.drawSprite(_coin.get_coin_x(),_coin.get_coin_y(),5,5,(int*)_coin.get_coin_sprite());
lewisgw 18:304700b5d8f8 162 lcd.drawSprite(_fire.get_fire_x(),_fire_y,5,8,(int*)_fire.get_fire_sprite());
lewisgw 10:8bf3713d9e9c 163 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 164 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 165 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 166 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 167 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 168 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 169 sprintf(buffer,"%2d",_player_score);
lewisgw 15:876c047a6ec9 170 lcd.printString(buffer,0,0);
lewisgw 11:b66170249a26 171 }
lewisgw 11:b66170249a26 172
lewisgw 11:b66170249a26 173 bool Engine::get_start_platform() {
lewisgw 14:9861fe85c803 174 // Set start platform flag to be false if the button A is pressed
lewisgw 14:9861fe85c803 175 // (so the starting text goes away after the first jump).
lewisgw 11:b66170249a26 176 if(_input.A_flag) _start_platform = false;
lewisgw 11:b66170249a26 177 return _start_platform;
lewisgw 15:876c047a6ec9 178 }
lewisgw 15:876c047a6ec9 179
lewisgw 15:876c047a6ec9 180 void Engine::check_coin_collision() {
lewisgw 16:331be5c7ed80 181 // If the skater coords match the coins, add 1 to the players score and print
lewisgw 16:331be5c7ed80 182 // a new coin in a random position
lewisgw 18:304700b5d8f8 183 if (_skater_x == _coin.get_coin_x() && (_skater_y == _coin.get_coin_y() - 10)) {
lewisgw 15:876c047a6ec9 184 _coin_collision_flag = true;
lewisgw 15:876c047a6ec9 185 _player_score++;
lewisgw 15:876c047a6ec9 186 _coin.update_coin((rand() % 100),(abs(rand() % 100 - 20)));
lewisgw 15:876c047a6ec9 187 }
lewisgw 16:331be5c7ed80 188 }
lewisgw 16:331be5c7ed80 189
lewisgw 18:304700b5d8f8 190 void Engine::check_fire_collision() {
lewisgw 18:304700b5d8f8 191 // If the skaters coord match the fire and he is not ducking, the player has died
lewisgw 17:f377df4ea7b1 192 // and the game is reset. Game will also reset if skater goes off the screen.
lewisgw 18:304700b5d8f8 193 if (_input.coord.y > -0.1 && _skater_x == _fire.get_fire_x() && _fire_y - 1 < _skater_y < _fire_y + 1) {
lewisgw 17:f377df4ea7b1 194 _skater.set_reset_flag(true);
lewisgw 18:304700b5d8f8 195 } else if ( _skater_x < -10 || _skater_x > 84 ) {
lewisgw 16:331be5c7ed80 196 _skater.set_reset_flag(true);
lewisgw 16:331be5c7ed80 197 }
lewisgw 16:331be5c7ed80 198 }
lewisgw 17:f377df4ea7b1 199
lewisgw 17:f377df4ea7b1 200 int Engine::get_player_score() {
lewisgw 17:f377df4ea7b1 201 return _player_score;
lewisgw 17:f377df4ea7b1 202 }
lewisgw 16:331be5c7ed80 203