ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Wed Apr 10 13:40:58 2019 +0000
Revision:
16:331be5c7ed80
Parent:
15:876c047a6ec9
Child:
17:f377df4ea7b1
Now a rotating 'ball of fire' that moves across the screen to duck and dodge. The game ends if you hit it.

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