Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
TanksEngine/TanksEngine.cpp@14:fe2e16cdf219, 2019-04-17 (annotated)
- Committer:
- el17mcd
- Date:
- Wed Apr 17 17:24:02 2019 +0000
- Revision:
- 14:fe2e16cdf219
- Parent:
- 13:feadff02d3f7
- Child:
- 15:fa5282fcd134
! Game now includes randomised wind that changes every turn. A bar at the top of the screen shows the severity of the wind in the x direction. Dot reticle added to show where the projectile is aimed.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| el17mcd | 7:a3ccabdebe2e | 1 | /* TanksEngine.cpp |
| el17mcd | 7:a3ccabdebe2e | 2 | Game Engine |
| el17mcd | 7:a3ccabdebe2e | 3 | 9.4.19 |
| el17mcd | 7:a3ccabdebe2e | 4 | */ |
| el17mcd | 7:a3ccabdebe2e | 5 | #include "TanksEngine.h" |
| el17mcd | 7:a3ccabdebe2e | 6 | #include "Projectile.h" |
| el17mcd | 12:9e6d5d0a0c82 | 7 | #include "Tank.h" |
| el17mcd | 11:4e2eb64031a0 | 8 | |
| el17mcd | 7:a3ccabdebe2e | 9 | TanksEngine::TanksEngine() |
| el17mcd | 11:4e2eb64031a0 | 10 | |
| el17mcd | 7:a3ccabdebe2e | 11 | { |
| el17mcd | 7:a3ccabdebe2e | 12 | |
| el17mcd | 7:a3ccabdebe2e | 13 | } |
| el17mcd | 7:a3ccabdebe2e | 14 | |
| el17mcd | 7:a3ccabdebe2e | 15 | TanksEngine::~TanksEngine() |
| el17mcd | 7:a3ccabdebe2e | 16 | { |
| el17mcd | 7:a3ccabdebe2e | 17 | |
| el17mcd | 7:a3ccabdebe2e | 18 | } |
| el17mcd | 11:4e2eb64031a0 | 19 | void TanksEngine::initgame() |
| el17mcd | 11:4e2eb64031a0 | 20 | { |
| el17mcd | 11:4e2eb64031a0 | 21 | _tankl.set_position(0, 0); |
| el17mcd | 13:feadff02d3f7 | 22 | _tankl.set_movement_limits(0, 21); |
| el17mcd | 11:4e2eb64031a0 | 23 | _tankl.set_speed(1); |
| el17mcd | 12:9e6d5d0a0c82 | 24 | _tankr.set_position(84-10, 0); |
| el17mcd | 13:feadff02d3f7 | 25 | _tankr.set_movement_limits(54, 74); |
| el17mcd | 12:9e6d5d0a0c82 | 26 | _tankr.set_speed(1); |
| el17mcd | 13:feadff02d3f7 | 27 | _tankl.set_health(6); |
| el17mcd | 13:feadff02d3f7 | 28 | _tankr.set_health(6); |
| el17mcd | 13:feadff02d3f7 | 29 | _turn = 1; |
| el17mcd | 14:fe2e16cdf219 | 30 | _grav = 0.035; |
| el17mcd | 14:fe2e16cdf219 | 31 | _wind = 0.00005 * (-100 + rand() % 201); |
| el17mcd | 11:4e2eb64031a0 | 32 | _fire = false; |
| el17mcd | 12:9e6d5d0a0c82 | 33 | _move = 0; |
| el17mcd | 11:4e2eb64031a0 | 34 | _turn_timer = 10; |
| el17mcd | 12:9e6d5d0a0c82 | 35 | cooldownl = -1; |
| el17mcd | 12:9e6d5d0a0c82 | 36 | cooldownr = -1; |
| el17mcd | 14:fe2e16cdf219 | 37 | |
| el17mcd | 12:9e6d5d0a0c82 | 38 | } |
| el17mcd | 12:9e6d5d0a0c82 | 39 | |
| el17mcd | 13:feadff02d3f7 | 40 | void TanksEngine::left_tank_turn(Graphics &graphics, Gamepad &pad) |
| el17mcd | 12:9e6d5d0a0c82 | 41 | { |
| el17mcd | 12:9e6d5d0a0c82 | 42 | _tankl.move_position(_move); |
| el17mcd | 13:feadff02d3f7 | 43 | if (_angle >= 355 && _angle <= 360 || _angle >= 0 && _angle <= 90) {// turret must be at acceptable angle |
| el17mcd | 13:feadff02d3f7 | 44 | _left_tank_shoots(); |
| el17mcd | 13:feadff02d3f7 | 45 | } |
| el17mcd | 13:feadff02d3f7 | 46 | graphics.show_health(_tankl.get_health(), 6, pad); |
| el17mcd | 11:4e2eb64031a0 | 47 | } |
| el17mcd | 11:4e2eb64031a0 | 48 | |
| el17mcd | 13:feadff02d3f7 | 49 | void TanksEngine::right_tank_turn(Graphics &graphics, Gamepad &pad) |
| el17mcd | 11:4e2eb64031a0 | 50 | { |
| el17mcd | 12:9e6d5d0a0c82 | 51 | _tankr.move_position(_move); |
| el17mcd | 13:feadff02d3f7 | 52 | if (_angle >= 270 && _angle <= 360 || _angle >= 0 && _angle <= 5) {// turret must be at acceptable angle |
| el17mcd | 13:feadff02d3f7 | 53 | _right_tank_shoots(); |
| el17mcd | 13:feadff02d3f7 | 54 | } |
| el17mcd | 13:feadff02d3f7 | 55 | graphics.show_health(_tankr.get_health(), 6, pad); |
| el17mcd | 11:4e2eb64031a0 | 56 | } |
| el17mcd | 11:4e2eb64031a0 | 57 | |
| el17mcd | 12:9e6d5d0a0c82 | 58 | void TanksEngine::render(Graphics graphics, N5110 &lcd) // Draw graphics for all objects, turrets rotate |
| el17mcd | 12:9e6d5d0a0c82 | 59 | { // depending on current turn |
| el17mcd | 12:9e6d5d0a0c82 | 60 | graphics.draw_tank_l(_tankl.get_position_x(), _tankl.get_position_y(), lcd); |
| el17mcd | 12:9e6d5d0a0c82 | 61 | if (_turn == 1) { |
| el17mcd | 14:fe2e16cdf219 | 62 | graphics.draw_turret_l(_tankl.get_position_x(), _tankl.get_position_y(), _angle, lcd); |
| el17mcd | 14:fe2e16cdf219 | 63 | if (_mag >= 0.5) { |
| el17mcd | 14:fe2e16cdf219 | 64 | graphics.draw_reticle(_tankl.get_position_x(), _tankl.get_position_y(), _angle, lcd); |
| el17mcd | 14:fe2e16cdf219 | 65 | } |
| el17mcd | 12:9e6d5d0a0c82 | 66 | } |
| el17mcd | 12:9e6d5d0a0c82 | 67 | if (_turn == 2 || _turn == 4) { |
| el17mcd | 12:9e6d5d0a0c82 | 68 | graphics.draw_projectile(_proj.get_position_x(), _proj.get_position_y(), lcd); |
| el17mcd | 12:9e6d5d0a0c82 | 69 | } |
| el17mcd | 12:9e6d5d0a0c82 | 70 | graphics.draw_tank_r(_tankr.get_position_x(), _tankr.get_position_y(), lcd); |
| el17mcd | 12:9e6d5d0a0c82 | 71 | if (_turn == 3) { |
| el17mcd | 12:9e6d5d0a0c82 | 72 | graphics.draw_turret_r(_tankr.get_position_x(), _tankr.get_position_y(), _angle, lcd); |
| el17mcd | 14:fe2e16cdf219 | 73 | if (_mag >= 0.5) { |
| el17mcd | 14:fe2e16cdf219 | 74 | graphics.draw_reticle(_tankr.get_position_x(), _tankr.get_position_y(), _angle, lcd); |
| el17mcd | 14:fe2e16cdf219 | 75 | } |
| el17mcd | 14:fe2e16cdf219 | 76 | } |
| el17mcd | 14:fe2e16cdf219 | 77 | if (_turn == 1 || _turn == 3) { |
| el17mcd | 14:fe2e16cdf219 | 78 | graphics.draw_wind_bar(_wind, lcd); |
| el17mcd | 12:9e6d5d0a0c82 | 79 | } |
| el17mcd | 11:4e2eb64031a0 | 80 | } |
| el17mcd | 11:4e2eb64031a0 | 81 | |
| el17mcd | 11:4e2eb64031a0 | 82 | void TanksEngine::_left_tank_shoots() |
| el17mcd | 11:4e2eb64031a0 | 83 | { |
| el17mcd | 11:4e2eb64031a0 | 84 | if (_fire == true) { |
| el17mcd | 11:4e2eb64031a0 | 85 | int angle = _angle; // change to an int |
| el17mcd | 12:9e6d5d0a0c82 | 86 | angle = (-angle + 90) % 360; // gamepad's convention is N = 0 clockwise, changed into E = 0 anticlockwise |
| el17mcd | 11:4e2eb64031a0 | 87 | int x = _tankl.get_position_x() + 5; |
| el17mcd | 13:feadff02d3f7 | 88 | int y = _tankl.get_position_y() + 5; //0.005 |
| el17mcd | 13:feadff02d3f7 | 89 | _proj.set_launch_parameters(x, y, angle, _vel, _grav, _wind); // set launch parameters for projectile based on tank/game parameters |
| el17mcd | 12:9e6d5d0a0c82 | 90 | |
| el17mcd | 12:9e6d5d0a0c82 | 91 | _tankl.generate_hitbox(); // generate hitboxes ready to determine collision during projectile phase |
| el17mcd | 12:9e6d5d0a0c82 | 92 | _tankr.generate_hitbox(); |
| el17mcd | 11:4e2eb64031a0 | 93 | _turn = 2; // change to projectile phase |
| el17mcd | 11:4e2eb64031a0 | 94 | } |
| el17mcd | 11:4e2eb64031a0 | 95 | } |
| el17mcd | 11:4e2eb64031a0 | 96 | |
| el17mcd | 12:9e6d5d0a0c82 | 97 | void TanksEngine::_right_tank_shoots() |
| el17mcd | 11:4e2eb64031a0 | 98 | { |
| el17mcd | 12:9e6d5d0a0c82 | 99 | if (_fire == true) { |
| el17mcd | 12:9e6d5d0a0c82 | 100 | int angle = _angle; // change to an int |
| el17mcd | 12:9e6d5d0a0c82 | 101 | angle = (-angle + 90) % 360; // gamepad's convention is N = 0 clockwise changed into E = 0 anticlockwise |
| el17mcd | 12:9e6d5d0a0c82 | 102 | int x = _tankr.get_position_x() + 5; |
| el17mcd | 12:9e6d5d0a0c82 | 103 | int y = _tankr.get_position_y() + 5; |
| el17mcd | 13:feadff02d3f7 | 104 | _proj.set_launch_parameters(x, y, angle, _vel, _grav, _wind); // set launch parameters for projectile |
| el17mcd | 12:9e6d5d0a0c82 | 105 | // based on tank/game parameters |
| el17mcd | 12:9e6d5d0a0c82 | 106 | _tankl.generate_hitbox(); // generate hitboxes ready to determine collision during projectile phase |
| el17mcd | 13:feadff02d3f7 | 107 | _tankr.generate_hitbox(); |
| el17mcd | 12:9e6d5d0a0c82 | 108 | _turn = 4; // change to projectile phase |
| el17mcd | 12:9e6d5d0a0c82 | 109 | } |
| el17mcd | 12:9e6d5d0a0c82 | 110 | } |
| el17mcd | 12:9e6d5d0a0c82 | 111 | |
| el17mcd | 13:feadff02d3f7 | 112 | void TanksEngine::projectile_phase(N5110 &lcd) |
| el17mcd | 12:9e6d5d0a0c82 | 113 | { |
| el17mcd | 12:9e6d5d0a0c82 | 114 | _proj.update_flight(); |
| el17mcd | 13:feadff02d3f7 | 115 | _proj.generate_hitbox(); |
| el17mcd | 13:feadff02d3f7 | 116 | if (_proj.check_boundaries() == true) { _change_turn(); } // change turn if projectile falls off left, |
| el17mcd | 13:feadff02d3f7 | 117 | _object_hit(lcd); |
| el17mcd | 11:4e2eb64031a0 | 118 | } |
| el17mcd | 11:4e2eb64031a0 | 119 | |
| el17mcd | 11:4e2eb64031a0 | 120 | void TanksEngine::_change_turn() |
| el17mcd | 11:4e2eb64031a0 | 121 | { |
| el17mcd | 12:9e6d5d0a0c82 | 122 | if (_turn == 2) { _turn = 3; } |
| el17mcd | 12:9e6d5d0a0c82 | 123 | if (_turn == 4) { _turn = 1; } |
| el17mcd | 14:fe2e16cdf219 | 124 | srand(time(0)); |
| el17mcd | 14:fe2e16cdf219 | 125 | _wind = 0.00005 * (-100 + rand() % 201); |
| el17mcd | 11:4e2eb64031a0 | 126 | } |
| el17mcd | 11:4e2eb64031a0 | 127 | |
| el17mcd | 12:9e6d5d0a0c82 | 128 | void TanksEngine::read_input(Gamepad &pad) |
| el17mcd | 12:9e6d5d0a0c82 | 129 | { |
| el17mcd | 13:feadff02d3f7 | 130 | _vel = 1.15 + pad.read_pot(); |
| el17mcd | 11:4e2eb64031a0 | 131 | _angle = pad.get_angle(); |
| el17mcd | 14:fe2e16cdf219 | 132 | _mag = pad.get_mag(); |
| el17mcd | 12:9e6d5d0a0c82 | 133 | if (pad.check_event(Gamepad::L_PRESSED) == true && cooldownl < 0) { |
| el17mcd | 11:4e2eb64031a0 | 134 | _move = -1 * !_move; // toggle movement to the left |
| el17mcd | 12:9e6d5d0a0c82 | 135 | cooldownl = 10; |
| el17mcd | 11:4e2eb64031a0 | 136 | } |
| el17mcd | 12:9e6d5d0a0c82 | 137 | else if (pad.check_event(Gamepad::R_PRESSED) == true && cooldownr < 0) { |
| el17mcd | 11:4e2eb64031a0 | 138 | _move = 1 * !_move; // toggle movement to the right |
| el17mcd | 12:9e6d5d0a0c82 | 139 | cooldownr = 10; |
| el17mcd | 12:9e6d5d0a0c82 | 140 | } |
| el17mcd | 13:feadff02d3f7 | 141 | else if (_turn == 2 || _turn == 4) { _move = 0; } // movement cannot be triggered during projectile phase |
| el17mcd | 12:9e6d5d0a0c82 | 142 | |
| el17mcd | 12:9e6d5d0a0c82 | 143 | if (pad.check_event(Gamepad::A_PRESSED) == true) { _fire = true; } |
| el17mcd | 12:9e6d5d0a0c82 | 144 | else { _fire = false; } |
| el17mcd | 12:9e6d5d0a0c82 | 145 | |
| el17mcd | 12:9e6d5d0a0c82 | 146 | _decrement_cooldowns(); |
| el17mcd | 11:4e2eb64031a0 | 147 | } |
| el17mcd | 11:4e2eb64031a0 | 148 | |
| el17mcd | 12:9e6d5d0a0c82 | 149 | bool TanksEngine::_collision_pl(Tank _tankl, Projectile _proj) // detects projectile hitting LEFT tank |
| el17mcd | 7:a3ccabdebe2e | 150 | { |
| el17mcd | 7:a3ccabdebe2e | 151 | for (int i0 = 0; i0 < 4; i0++) { |
| el17mcd | 7:a3ccabdebe2e | 152 | for (int i1 = 0; i1 < 40; i1++) { |
| el17mcd | 12:9e6d5d0a0c82 | 153 | if (_proj.get_hitbox(i0) == _tankl.get_hitbox(i1)) { return true; } |
| el17mcd | 7:a3ccabdebe2e | 154 | } |
| el17mcd | 7:a3ccabdebe2e | 155 | } |
| el17mcd | 7:a3ccabdebe2e | 156 | return false; |
| el17mcd | 7:a3ccabdebe2e | 157 | } |
| el17mcd | 7:a3ccabdebe2e | 158 | |
| el17mcd | 13:feadff02d3f7 | 159 | bool TanksEngine::_collision_pr(Tank _tankr, Projectile _proj) // detects projectile hitting RIGHT tank |
| el17mcd | 13:feadff02d3f7 | 160 | { |
| el17mcd | 13:feadff02d3f7 | 161 | for (int i0 = 0; i0 < 4; i0++) { |
| el17mcd | 13:feadff02d3f7 | 162 | for (int i1 = 0; i1 < 40; i1++) { |
| el17mcd | 13:feadff02d3f7 | 163 | if (_proj.get_hitbox(i0) == _tankr.get_hitbox(i1)) { return true; } |
| el17mcd | 13:feadff02d3f7 | 164 | } |
| el17mcd | 13:feadff02d3f7 | 165 | } |
| el17mcd | 13:feadff02d3f7 | 166 | return false; |
| el17mcd | 13:feadff02d3f7 | 167 | } |
| el17mcd | 13:feadff02d3f7 | 168 | |
| el17mcd | 13:feadff02d3f7 | 169 | bool TanksEngine::_collision_pm(N5110 &lcd, Projectile _proj) // detects projectile hitting the MAP |
| el17mcd | 13:feadff02d3f7 | 170 | { |
| el17mcd | 14:fe2e16cdf219 | 171 | int x = _proj.get_position_x(); |
| el17mcd | 14:fe2e16cdf219 | 172 | int y = _proj.get_position_y(); |
| el17mcd | 14:fe2e16cdf219 | 173 | if (x >= 31 && x <= 54) { |
| el17mcd | 14:fe2e16cdf219 | 174 | if (lcd.getPixel(x, 48 - y) == 1) { |
| el17mcd | 14:fe2e16cdf219 | 175 | // lcd.setPixel(x, y, false); |
| el17mcd | 13:feadff02d3f7 | 176 | return true; |
| el17mcd | 14:fe2e16cdf219 | 177 | } else if (lcd.getPixel(x + 1,48 - y) == 1) { |
| el17mcd | 14:fe2e16cdf219 | 178 | // lcd.setPixel(x, y, false); |
| el17mcd | 13:feadff02d3f7 | 179 | return true; |
| el17mcd | 13:feadff02d3f7 | 180 | } else { return false ;} |
| el17mcd | 13:feadff02d3f7 | 181 | } |
| el17mcd | 13:feadff02d3f7 | 182 | else {return false ; } |
| el17mcd | 13:feadff02d3f7 | 183 | } |
| el17mcd | 13:feadff02d3f7 | 184 | |
| el17mcd | 13:feadff02d3f7 | 185 | void TanksEngine::_object_hit(N5110 &lcd) |
| el17mcd | 13:feadff02d3f7 | 186 | { |
| el17mcd | 13:feadff02d3f7 | 187 | if (_collision_pl(_tankl, _proj) == true) { |
| el17mcd | 13:feadff02d3f7 | 188 | _tankl.lose_health(); |
| el17mcd | 13:feadff02d3f7 | 189 | _change_turn(); |
| el17mcd | 13:feadff02d3f7 | 190 | } |
| el17mcd | 13:feadff02d3f7 | 191 | else if (_collision_pr(_tankr, _proj) == true) { |
| el17mcd | 13:feadff02d3f7 | 192 | _tankr.lose_health(); |
| el17mcd | 13:feadff02d3f7 | 193 | _change_turn(); |
| el17mcd | 13:feadff02d3f7 | 194 | } |
| el17mcd | 13:feadff02d3f7 | 195 | else if (_collision_pm(lcd, _proj) == true) { |
| el17mcd | 13:feadff02d3f7 | 196 | _change_turn(); |
| el17mcd | 13:feadff02d3f7 | 197 | } |
| el17mcd | 13:feadff02d3f7 | 198 | } |
| el17mcd | 13:feadff02d3f7 | 199 | |
| el17mcd | 11:4e2eb64031a0 | 200 | int TanksEngine::get_turn() |
| el17mcd | 11:4e2eb64031a0 | 201 | { |
| el17mcd | 11:4e2eb64031a0 | 202 | return _turn; |
| el17mcd | 11:4e2eb64031a0 | 203 | } |
| el17mcd | 11:4e2eb64031a0 | 204 | |
| el17mcd | 12:9e6d5d0a0c82 | 205 | void TanksEngine::_decrement_cooldowns() // Prevents buttons being pressed multiple times in quick succession |
| el17mcd | 12:9e6d5d0a0c82 | 206 | { |
| el17mcd | 12:9e6d5d0a0c82 | 207 | cooldownl--; |
| el17mcd | 12:9e6d5d0a0c82 | 208 | cooldownr--; |
| el17mcd | 12:9e6d5d0a0c82 | 209 | if (cooldownl < -100) { cooldownl = -1; } |
| el17mcd | 12:9e6d5d0a0c82 | 210 | if (cooldownr < -100) { cooldownr = -1; } |
| el17mcd | 12:9e6d5d0a0c82 | 211 | } |
| el17mcd | 12:9e6d5d0a0c82 | 212 | |
| el17mcd | 12:9e6d5d0a0c82 | 213 | void TanksEngine::end() |
| el17mcd | 12:9e6d5d0a0c82 | 214 | { |
| el17mcd | 12:9e6d5d0a0c82 | 215 | if (_tankl.get_health() == 0) { |
| el17mcd | 12:9e6d5d0a0c82 | 216 | _tankr.set_position(84/2 - 5, 20); |
| el17mcd | 12:9e6d5d0a0c82 | 217 | _tankl.set_position(-20, 0); |
| el17mcd | 12:9e6d5d0a0c82 | 218 | _turn = 5; |
| el17mcd | 12:9e6d5d0a0c82 | 219 | } |
| el17mcd | 12:9e6d5d0a0c82 | 220 | else if (_tankr.get_health() == 0) { |
| el17mcd | 12:9e6d5d0a0c82 | 221 | _tankl.set_position(84/2 - 5, 20); |
| el17mcd | 12:9e6d5d0a0c82 | 222 | _tankr.set_position(-20, 0); |
| el17mcd | 12:9e6d5d0a0c82 | 223 | _turn = 5; |
| el17mcd | 12:9e6d5d0a0c82 | 224 | } |
| el17mcd | 12:9e6d5d0a0c82 | 225 | } |
| el17mcd | 12:9e6d5d0a0c82 | 226 |