ELEC2645 (2018/19) / Mbed 2 deprecated EL17MCD

Dependencies:   mbed

Committer:
el17mcd
Date:
Sun Apr 14 15:58:12 2019 +0000
Revision:
12:9e6d5d0a0c82
Parent:
11:4e2eb64031a0
Child:
13:feadff02d3f7
! TankL class changed into generic Tank class. Separate graphics class to house and govern the use of sprites. Game now can produce two tanks on the screen facing opposite directions. They can take turns to fire projectiles based off joystick angle.

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 11:4e2eb64031a0 22 _tankl.set_speed(1);
el17mcd 12:9e6d5d0a0c82 23 _tankr.set_position(84-10, 0);
el17mcd 12:9e6d5d0a0c82 24 _tankr.set_speed(1);
el17mcd 12:9e6d5d0a0c82 25 _tankl.set_health(1);
el17mcd 12:9e6d5d0a0c82 26 _tankr.set_health(1);
el17mcd 12:9e6d5d0a0c82 27 _turn = 1; // change to 1
el17mcd 11:4e2eb64031a0 28 _fire = false;
el17mcd 12:9e6d5d0a0c82 29 _move = 0;
el17mcd 11:4e2eb64031a0 30 _turn_timer = 10;
el17mcd 12:9e6d5d0a0c82 31 cooldownl = -1;
el17mcd 12:9e6d5d0a0c82 32 cooldownr = -1;
el17mcd 12:9e6d5d0a0c82 33 }
el17mcd 12:9e6d5d0a0c82 34
el17mcd 12:9e6d5d0a0c82 35 void TanksEngine::left_tank_turn(Gamepad &pad)
el17mcd 12:9e6d5d0a0c82 36 {
el17mcd 12:9e6d5d0a0c82 37 _tankl.move_position(_move);
el17mcd 12:9e6d5d0a0c82 38 _left_tank_shoots();
el17mcd 11:4e2eb64031a0 39 }
el17mcd 11:4e2eb64031a0 40
el17mcd 12:9e6d5d0a0c82 41 void TanksEngine::right_tank_turn(Gamepad &pad)
el17mcd 11:4e2eb64031a0 42 {
el17mcd 12:9e6d5d0a0c82 43 _tankr.move_position(_move);
el17mcd 12:9e6d5d0a0c82 44 _right_tank_shoots();
el17mcd 11:4e2eb64031a0 45 }
el17mcd 11:4e2eb64031a0 46
el17mcd 12:9e6d5d0a0c82 47 void TanksEngine::render(Graphics graphics, N5110 &lcd) // Draw graphics for all objects, turrets rotate
el17mcd 12:9e6d5d0a0c82 48 { // depending on current turn
el17mcd 12:9e6d5d0a0c82 49 graphics.draw_tank_l(_tankl.get_position_x(), _tankl.get_position_y(), lcd);
el17mcd 12:9e6d5d0a0c82 50 if (_turn == 1) {
el17mcd 12:9e6d5d0a0c82 51 graphics.draw_turret_l(_tankl.get_position_x(), _tankl.get_position_y(), _angle, lcd);
el17mcd 12:9e6d5d0a0c82 52 }
el17mcd 12:9e6d5d0a0c82 53 if (_turn == 2 || _turn == 4) {
el17mcd 12:9e6d5d0a0c82 54 graphics.draw_projectile(_proj.get_position_x(), _proj.get_position_y(), lcd);
el17mcd 12:9e6d5d0a0c82 55 }
el17mcd 12:9e6d5d0a0c82 56 graphics.draw_tank_r(_tankr.get_position_x(), _tankr.get_position_y(), lcd);
el17mcd 12:9e6d5d0a0c82 57 if (_turn == 3) {
el17mcd 12:9e6d5d0a0c82 58 graphics.draw_turret_r(_tankr.get_position_x(), _tankr.get_position_y(), _angle, lcd);
el17mcd 12:9e6d5d0a0c82 59 }
el17mcd 11:4e2eb64031a0 60 }
el17mcd 11:4e2eb64031a0 61
el17mcd 11:4e2eb64031a0 62 void TanksEngine::_left_tank_shoots()
el17mcd 11:4e2eb64031a0 63 {
el17mcd 11:4e2eb64031a0 64 if (_fire == true) {
el17mcd 11:4e2eb64031a0 65 int angle = _angle; // change to an int
el17mcd 12:9e6d5d0a0c82 66 angle = (-angle + 90) % 360; // gamepad's convention is N = 0 clockwise, changed into E = 0 anticlockwise
el17mcd 11:4e2eb64031a0 67 int x = _tankl.get_position_x() + 5;
el17mcd 12:9e6d5d0a0c82 68 int y = _tankl.get_position_y() + 5;
el17mcd 12:9e6d5d0a0c82 69 _proj.set_launch_parameters(x, y, angle, 1.3, 0.02, 0.00); // set launch parameters for projectile based on tank/game parameters
el17mcd 12:9e6d5d0a0c82 70
el17mcd 12:9e6d5d0a0c82 71 _tankl.generate_hitbox(); // generate hitboxes ready to determine collision during projectile phase
el17mcd 12:9e6d5d0a0c82 72 _tankr.generate_hitbox();
el17mcd 11:4e2eb64031a0 73 _turn = 2; // change to projectile phase
el17mcd 11:4e2eb64031a0 74 }
el17mcd 11:4e2eb64031a0 75 }
el17mcd 11:4e2eb64031a0 76
el17mcd 12:9e6d5d0a0c82 77 void TanksEngine::_right_tank_shoots()
el17mcd 11:4e2eb64031a0 78 {
el17mcd 12:9e6d5d0a0c82 79 if (_fire == true) {
el17mcd 12:9e6d5d0a0c82 80 int angle = _angle; // change to an int
el17mcd 12:9e6d5d0a0c82 81 angle = (-angle + 90) % 360; // gamepad's convention is N = 0 clockwise changed into E = 0 anticlockwise
el17mcd 12:9e6d5d0a0c82 82 int x = _tankr.get_position_x() + 5;
el17mcd 12:9e6d5d0a0c82 83 int y = _tankr.get_position_y() + 5;
el17mcd 12:9e6d5d0a0c82 84 _proj.set_launch_parameters(x, y, angle, 1.3, 0.02, 0.00); // set launch parameters for projectile
el17mcd 12:9e6d5d0a0c82 85 // based on tank/game parameters
el17mcd 12:9e6d5d0a0c82 86 _tankl.generate_hitbox(); // generate hitboxes ready to determine collision during projectile phase
el17mcd 12:9e6d5d0a0c82 87 _tankr.generate_hitbox();
el17mcd 12:9e6d5d0a0c82 88 _turn = 4; // change to projectile phase
el17mcd 12:9e6d5d0a0c82 89 }
el17mcd 12:9e6d5d0a0c82 90 }
el17mcd 12:9e6d5d0a0c82 91
el17mcd 12:9e6d5d0a0c82 92 void TanksEngine::projectile_phase()
el17mcd 12:9e6d5d0a0c82 93 {
el17mcd 12:9e6d5d0a0c82 94 _proj.update_flight();
el17mcd 11:4e2eb64031a0 95 if (_proj.check_boundaries() == true) { _change_turn(); }
el17mcd 12:9e6d5d0a0c82 96 /* if (_collision_pl(_tankl, _proj) == true) {
el17mcd 12:9e6d5d0a0c82 97 _tankl.lose_health();
el17mcd 12:9e6d5d0a0c82 98 _change_turn();
el17mcd 12:9e6d5d0a0c82 99 } */
el17mcd 11:4e2eb64031a0 100 }
el17mcd 11:4e2eb64031a0 101
el17mcd 11:4e2eb64031a0 102 void TanksEngine::_change_turn()
el17mcd 11:4e2eb64031a0 103 {
el17mcd 12:9e6d5d0a0c82 104 if (_turn == 2) { _turn = 3; }
el17mcd 12:9e6d5d0a0c82 105 if (_turn == 4) { _turn = 1; }
el17mcd 11:4e2eb64031a0 106 }
el17mcd 11:4e2eb64031a0 107
el17mcd 12:9e6d5d0a0c82 108 void TanksEngine::read_input(Gamepad &pad)
el17mcd 12:9e6d5d0a0c82 109 {
el17mcd 11:4e2eb64031a0 110 _angle = pad.get_angle();
el17mcd 12:9e6d5d0a0c82 111 if (pad.check_event(Gamepad::L_PRESSED) == true && cooldownl < 0) {
el17mcd 11:4e2eb64031a0 112 _move = -1 * !_move; // toggle movement to the left
el17mcd 12:9e6d5d0a0c82 113 cooldownl = 10;
el17mcd 11:4e2eb64031a0 114 }
el17mcd 12:9e6d5d0a0c82 115 else if (pad.check_event(Gamepad::R_PRESSED) == true && cooldownr < 0) {
el17mcd 11:4e2eb64031a0 116 _move = 1 * !_move; // toggle movement to the right
el17mcd 12:9e6d5d0a0c82 117 cooldownr = 10;
el17mcd 12:9e6d5d0a0c82 118 }
el17mcd 12:9e6d5d0a0c82 119 else if (_turn == 2 || _turn == 4) { _move = 0; }
el17mcd 12:9e6d5d0a0c82 120
el17mcd 12:9e6d5d0a0c82 121 if (pad.check_event(Gamepad::A_PRESSED) == true) { _fire = true; }
el17mcd 12:9e6d5d0a0c82 122 else { _fire = false; }
el17mcd 12:9e6d5d0a0c82 123
el17mcd 12:9e6d5d0a0c82 124 _decrement_cooldowns();
el17mcd 11:4e2eb64031a0 125 }
el17mcd 11:4e2eb64031a0 126
el17mcd 12:9e6d5d0a0c82 127 bool TanksEngine::_collision_pl(Tank _tankl, Projectile _proj) // detects projectile hitting LEFT tank
el17mcd 7:a3ccabdebe2e 128 {
el17mcd 7:a3ccabdebe2e 129 for (int i0 = 0; i0 < 4; i0++) {
el17mcd 7:a3ccabdebe2e 130 for (int i1 = 0; i1 < 40; i1++) {
el17mcd 12:9e6d5d0a0c82 131 if (_proj.get_hitbox(i0) == _tankl.get_hitbox(i1)) { return true; }
el17mcd 7:a3ccabdebe2e 132 }
el17mcd 7:a3ccabdebe2e 133 }
el17mcd 7:a3ccabdebe2e 134 return false;
el17mcd 7:a3ccabdebe2e 135 }
el17mcd 7:a3ccabdebe2e 136
el17mcd 11:4e2eb64031a0 137 int TanksEngine::get_turn()
el17mcd 11:4e2eb64031a0 138 {
el17mcd 11:4e2eb64031a0 139 return _turn;
el17mcd 11:4e2eb64031a0 140 }
el17mcd 11:4e2eb64031a0 141
el17mcd 12:9e6d5d0a0c82 142 void TanksEngine::_decrement_cooldowns() // Prevents buttons being pressed multiple times in quick succession
el17mcd 12:9e6d5d0a0c82 143 {
el17mcd 12:9e6d5d0a0c82 144 cooldownl--;
el17mcd 12:9e6d5d0a0c82 145 cooldownr--;
el17mcd 12:9e6d5d0a0c82 146 if (cooldownl < -100) { cooldownl = -1; }
el17mcd 12:9e6d5d0a0c82 147 if (cooldownr < -100) { cooldownr = -1; }
el17mcd 12:9e6d5d0a0c82 148 }
el17mcd 12:9e6d5d0a0c82 149
el17mcd 12:9e6d5d0a0c82 150 void TanksEngine::end()
el17mcd 12:9e6d5d0a0c82 151 {
el17mcd 12:9e6d5d0a0c82 152 if (_tankl.get_health() == 0) {
el17mcd 12:9e6d5d0a0c82 153 _tankr.set_position(84/2 - 5, 20);
el17mcd 12:9e6d5d0a0c82 154 _tankl.set_position(-20, 0);
el17mcd 12:9e6d5d0a0c82 155 _turn = 5;
el17mcd 12:9e6d5d0a0c82 156 }
el17mcd 12:9e6d5d0a0c82 157 else if (_tankr.get_health() == 0) {
el17mcd 12:9e6d5d0a0c82 158 _tankl.set_position(84/2 - 5, 20);
el17mcd 12:9e6d5d0a0c82 159 _tankr.set_position(-20, 0);
el17mcd 12:9e6d5d0a0c82 160 _turn = 5;
el17mcd 12:9e6d5d0a0c82 161 }
el17mcd 12:9e6d5d0a0c82 162 }
el17mcd 12:9e6d5d0a0c82 163