ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Thu Apr 04 18:19:26 2019 +0000
Revision:
14:9861fe85c803
Parent:
11:b66170249a26
Child:
15:876c047a6ec9
Same functionality as last commit, large functions have been broken up into smaller ones and every .cpp file commented.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lewisgw 5:eda40cdde3e7 1 #include "Engine.h"
lewisgw 5:eda40cdde3e7 2
lewisgw 14:9861fe85c803 3 // Constructor and destructor
lewisgw 9:fff2009f826e 4 Engine::Engine() {}
lewisgw 5:eda40cdde3e7 5
lewisgw 9:fff2009f826e 6 Engine::~Engine() {}
lewisgw 5:eda40cdde3e7 7
lewisgw 8:5327418f823a 8 void Engine::check_reset() {
lewisgw 14:9861fe85c803 9 // Reset the game if the skater has fallen (i.e. reset flag = TRUE).
lewisgw 14:9861fe85c803 10 // 40 and 22 refer to the inital lengths of lower and upper platfroms respectivly.
lewisgw 9:fff2009f826e 11 if (_skater.get_reset_flag()) {
lewisgw 9:fff2009f826e 12 reset_skater();
lewisgw 10:8bf3713d9e9c 13 _lower_map.init(40);
lewisgw 10:8bf3713d9e9c 14 _upper_map.init(22);
lewisgw 8:5327418f823a 15 _skater.set_reset_flag(false);
lewisgw 8:5327418f823a 16 wait(1);
lewisgw 9:fff2009f826e 17 }
lewisgw 9:fff2009f826e 18 }
lewisgw 9:fff2009f826e 19
lewisgw 9:fff2009f826e 20 void Engine::reset_skater() {
lewisgw 9:fff2009f826e 21 _moving_counter = 0;
lewisgw 9:fff2009f826e 22 _jump_counter = 0;
lewisgw 9:fff2009f826e 23 _direction = Left;
lewisgw 10:8bf3713d9e9c 24 _level_condition = 0;
lewisgw 11:b66170249a26 25 _start_platform = true;
lewisgw 9:fff2009f826e 26 _x = 40;
lewisgw 11:b66170249a26 27 _y = 23;
lewisgw 9:fff2009f826e 28 }
lewisgw 8:5327418f823a 29
lewisgw 5:eda40cdde3e7 30 void Engine::init() {
lewisgw 14:9861fe85c803 31 // Initialisation of the game. 40 and 22 refer to inital line lengths.
lewisgw 9:fff2009f826e 32 reset_skater();
lewisgw 10:8bf3713d9e9c 33 _lower_map.init(40);
lewisgw 10:8bf3713d9e9c 34 _upper_map.init(22);
lewisgw 11:b66170249a26 35 _skater.set_reset_flag(false);
lewisgw 9:fff2009f826e 36 srand(time(NULL));
lewisgw 9:fff2009f826e 37 }
lewisgw 5:eda40cdde3e7 38
lewisgw 5:eda40cdde3e7 39 void Engine::read_input(Gamepad &gamepad) {
lewisgw 9:fff2009f826e 40 _input.coord = gamepad.get_mapped_coord();
lewisgw 9:fff2009f826e 41 _input.A_flag = gamepad.check_event(Gamepad::A_PRESSED);
lewisgw 9:fff2009f826e 42 }
lewisgw 5:eda40cdde3e7 43
lewisgw 5:eda40cdde3e7 44 void Engine::process_y() {
lewisgw 14:9861fe85c803 45 // Sets the y coordinate by checking if the skater should be falling, and
lewisgw 14:9861fe85c803 46 // updating the fall flag and jump counter.
lewisgw 9:fff2009f826e 47 set_fall_flag();
lewisgw 9:fff2009f826e 48 if (_fall_flag) {
lewisgw 9:fff2009f826e 49 _skater.fall(_fall_flag);
lewisgw 9:fff2009f826e 50 } else {
lewisgw 10:8bf3713d9e9c 51 _skater.set_y_position( _input.A_flag, _jump_counter, _level_condition );
lewisgw 9:fff2009f826e 52 }
lewisgw 9:fff2009f826e 53 _fall_flag = _skater.get_fall_flag();
lewisgw 9:fff2009f826e 54 _y = _skater.get_y_position();
lewisgw 9:fff2009f826e 55 _jump_counter = _skater.get_jump_counter();
lewisgw 9:fff2009f826e 56 }
lewisgw 14:9861fe85c803 57
lewisgw 9:fff2009f826e 58 void Engine::set_fall_flag() {
lewisgw 14:9861fe85c803 59 // Set the fall flag to true if the skater is not on one of the platforms.
lewisgw 10:8bf3713d9e9c 60 if (((_lower_line_1.x_end < _x) && (_x < (_lower_line_2.x_start - 6))) && _y == 23) {
lewisgw 9:fff2009f826e 61 _fall_flag = true;
lewisgw 10:8bf3713d9e9c 62 } else if (((_lower_line_2.x_end < _x) && (_x < (_lower_line_3.x_start - 6))) && _y == 23) {
lewisgw 9:fff2009f826e 63 _fall_flag = true;
lewisgw 10:8bf3713d9e9c 64 } else if (((_lower_line_3.x_end < _x) && (_x < (_lower_line_1.x_start - 6))) && _y == 23) {
lewisgw 9:fff2009f826e 65 _fall_flag = true;
lewisgw 9:fff2009f826e 66 }
lewisgw 9:fff2009f826e 67 }
lewisgw 5:eda40cdde3e7 68
lewisgw 7:bbc2b75c1418 69 void Engine::process_x(int t) {
lewisgw 14:9861fe85c803 70 // Reset the game if the skater goes off the screen, and update x coordinate.
lewisgw 14:9861fe85c803 71 // Will move the skater to the left along with the platforms (if he is not moving
lewisgw 14:9861fe85c803 72 // left already).
lewisgw 9:fff2009f826e 73 if ( _x < -10 || _x > 84 ) {
lewisgw 8:5327418f823a 74 _skater.set_reset_flag(true);
lewisgw 9:fff2009f826e 75 } else {
lewisgw 9:fff2009f826e 76 _skater.set_x_position_and_sprite(_input.coord.x,
lewisgw 9:fff2009f826e 77 _moving_counter,
lewisgw 9:fff2009f826e 78 _direction,
lewisgw 9:fff2009f826e 79 _input.coord.y);
lewisgw 5:eda40cdde3e7 80 _x = _skater.get_x_position();
lewisgw 5:eda40cdde3e7 81 _moving_counter = _skater.get_moving_counter();
lewisgw 10:8bf3713d9e9c 82 if ((t % 4 == 0) && (_input.coord.x > -0.1)) {
lewisgw 9:fff2009f826e 83 _moving_counter--;
lewisgw 7:bbc2b75c1418 84 }
lewisgw 9:fff2009f826e 85 }
lewisgw 9:fff2009f826e 86 }
lewisgw 5:eda40cdde3e7 87
lewisgw 5:eda40cdde3e7 88 void Engine::process_sprite() {
lewisgw 14:9861fe85c803 89 // Update the sprite and direction.
lewisgw 9:fff2009f826e 90 _sprite = _skater.get_sprite_value();
lewisgw 9:fff2009f826e 91 _direction = _skater.get_direction();
lewisgw 9:fff2009f826e 92 }
lewisgw 5:eda40cdde3e7 93
lewisgw 5:eda40cdde3e7 94
lewisgw 10:8bf3713d9e9c 95 void Engine::set_level_condition() {
lewisgw 14:9861fe85c803 96 // If the skater is under or on top of any of the upper platforms, set
lewisgw 14:9861fe85c803 97 // level condition to 1.
lewisgw 10:8bf3713d9e9c 98 if (((_upper_line_1.x_start - 6) <= _x) && (_x <= _upper_line_1.x_end)) {
lewisgw 10:8bf3713d9e9c 99 _level_condition = 1;
lewisgw 10:8bf3713d9e9c 100 } else if (((_upper_line_2.x_start - 6) <= _x) && (_x <= _upper_line_2.x_end)) {
lewisgw 10:8bf3713d9e9c 101 _level_condition = 1;
lewisgw 10:8bf3713d9e9c 102 } else if (((_upper_line_3.x_start - 6) <= _x) && (_x <= _upper_line_3.x_end)) {
lewisgw 10:8bf3713d9e9c 103 _level_condition = 1;
lewisgw 9:fff2009f826e 104 } else {
lewisgw 10:8bf3713d9e9c 105 _level_condition = 0;
lewisgw 10:8bf3713d9e9c 106 }
lewisgw 9:fff2009f826e 107 }
lewisgw 7:bbc2b75c1418 108
lewisgw 7:bbc2b75c1418 109 void Engine::generate_map() {
lewisgw 10:8bf3713d9e9c 110 generate_lower_lines();
lewisgw 10:8bf3713d9e9c 111 generate_upper_lines();
lewisgw 9:fff2009f826e 112 }
lewisgw 5:eda40cdde3e7 113
lewisgw 10:8bf3713d9e9c 114 void Engine::generate_lower_lines() {
lewisgw 14:9861fe85c803 115 // Use a scaled random number to generate the length of the lower lines.
lewisgw 10:8bf3713d9e9c 116 _length_1 = (rand() %20) + 10;
lewisgw 10:8bf3713d9e9c 117 _lower_map.generate_line_1(_length_1);
lewisgw 10:8bf3713d9e9c 118 _lower_line_1 = _lower_map.get_line_1();
lewisgw 10:8bf3713d9e9c 119 _length_2 = (rand() %20) + 10;
lewisgw 10:8bf3713d9e9c 120 _lower_map.generate_line_2(_length_2);
lewisgw 10:8bf3713d9e9c 121 _lower_line_2 = _lower_map.get_line_2();
lewisgw 10:8bf3713d9e9c 122 _length_3 = (rand() %20) + 10;
lewisgw 10:8bf3713d9e9c 123 _lower_map.generate_line_3(_length_3);
lewisgw 10:8bf3713d9e9c 124 _lower_line_3 = _lower_map.get_line_3();
lewisgw 10:8bf3713d9e9c 125 }
lewisgw 10:8bf3713d9e9c 126
lewisgw 10:8bf3713d9e9c 127 void Engine::generate_upper_lines() {
lewisgw 14:9861fe85c803 128 // Set the length of the lower lines to be proportionally smaller to
lewisgw 14:9861fe85c803 129 // the length of the upper lines.
lewisgw 10:8bf3713d9e9c 130 _upper_map.generate_line_1(_length_1 / 2);
lewisgw 10:8bf3713d9e9c 131 _upper_line_1 = _upper_map.get_line_1();
lewisgw 10:8bf3713d9e9c 132 _upper_map.generate_line_2(_length_2 / 2);
lewisgw 10:8bf3713d9e9c 133 _upper_line_2 = _upper_map.get_line_2();
lewisgw 10:8bf3713d9e9c 134 _upper_map.generate_line_3(_length_3 / 2);
lewisgw 10:8bf3713d9e9c 135 _upper_line_3 = _upper_map.get_line_3();
lewisgw 10:8bf3713d9e9c 136 }
lewisgw 5:eda40cdde3e7 137
lewisgw 5:eda40cdde3e7 138 void Engine::update_lcd(N5110 &lcd){
lewisgw 9:fff2009f826e 139 _skate_sprite = _skater.get_sprite(_sprite);
lewisgw 9:fff2009f826e 140 lcd.drawSprite(_x,_y,17,10,(int *)_skate_sprite);
lewisgw 10:8bf3713d9e9c 141 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 142 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 143 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 144 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 145 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 146 lcd.drawLine(_upper_line_3.x_start,_upper_line_3.y,_upper_line_3.x_end,_upper_line_3.y,FILL_BLACK);
lewisgw 11:b66170249a26 147 }
lewisgw 11:b66170249a26 148
lewisgw 11:b66170249a26 149 bool Engine::get_start_platform() {
lewisgw 14:9861fe85c803 150 // Set start platform flag to be false if the button A is pressed
lewisgw 14:9861fe85c803 151 // (so the starting text goes away after the first jump).
lewisgw 11:b66170249a26 152 if(_input.A_flag) _start_platform = false;
lewisgw 11:b66170249a26 153 return _start_platform;
lewisgw 9:fff2009f826e 154 }