ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Sat Apr 06 17:13:37 2019 +0000
Revision:
15:876c047a6ec9
Parent:
14:9861fe85c803
Child:
16:331be5c7ed80
There is now a coin to collect generated in a random position on the map. The number of coins you collect is displayed at the top of the screen.

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