ELEC2645 (2018/19) / Mbed 2 deprecated EL17MCD

Dependencies:   mbed

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?

UserRevisionLine numberNew 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