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@12:9e6d5d0a0c82, 2019-04-14 (annotated)
- 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?
| 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 | 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 |