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 MotionSensor
Entity/Player/Player.cpp@50:2c5cb92a5361, 2019-05-09 (annotated)
- Committer:
- el17sm
- Date:
- Thu May 09 06:33:28 2019 +0000
- Revision:
- 50:2c5cb92a5361
- Parent:
- 41:0697508a28ba
- Child:
- 51:4d0cd75e7ed3
Room Engine fully commented;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| el17sm | 10:1a3499f6b583 | 1 | #include "Player.h" |
| el17sm | 10:1a3499f6b583 | 2 | #include "math.h" |
| el17sm | 10:1a3499f6b583 | 3 | |
| el17sm | 13:d04a6caba40d | 4 | // Constructor |
| el17sm | 22:7abf4581bc9b | 5 | Player::Player(float pos_x, float pos_y) |
| el17sm | 22:7abf4581bc9b | 6 | { |
| el17sm | 10:1a3499f6b583 | 7 | moving = false; |
| el17sm | 10:1a3499f6b583 | 8 | face = 0; |
| el17sm | 16:ddb203a74dfc | 9 | hp = 3; |
| el17sm | 23:5a8f75e93508 | 10 | attack = 1; |
| el17sm | 10:1a3499f6b583 | 11 | hitbox.width = 6; |
| el17sm | 10:1a3499f6b583 | 12 | hitbox.height = 5; |
| el17sm | 10:1a3499f6b583 | 13 | position.x = pos_x; |
| el17sm | 10:1a3499f6b583 | 14 | position.y = pos_y; |
| el17sm | 10:1a3499f6b583 | 15 | sprite_size.width = 6; |
| el17sm | 10:1a3499f6b583 | 16 | sprite_size.height = 12; |
| el17sm | 10:1a3499f6b583 | 17 | sprite_size.offset_x = 0; |
| el17sm | 35:06cd6be999ad | 18 | sprite_size.offset_y = -7; |
| el17sm | 12:a1c1991835ca | 19 | frame.count = 0; |
| el17sm | 12:a1c1991835ca | 20 | frame.number = 0; |
| el17sm | 12:a1c1991835ca | 21 | frame.max = 4; |
| el17sm | 22:7abf4581bc9b | 22 | for (int i = 0; i < bullets_max; i++) { |
| el17sm | 22:7abf4581bc9b | 23 | valid_bullets[i] = false; |
| el17sm | 22:7abf4581bc9b | 24 | } |
| el17sm | 15:44d5cc33d389 | 25 | fire_rate_counter = 0; |
| el17sm | 33:4f3948dcd2f7 | 26 | |
| el17sm | 33:4f3948dcd2f7 | 27 | invulnerability_counter = INVULNERABILITY_PERIOD; |
| el17sm | 22:7abf4581bc9b | 28 | |
| el17sm | 16:ddb203a74dfc | 29 | // Upgradable status |
| el17sm | 23:5a8f75e93508 | 30 | fire_rate_delay = 30; |
| el17sm | 23:5a8f75e93508 | 31 | velocity = 0.7; |
| el17sm | 23:5a8f75e93508 | 32 | _bullet_speed = 1; |
| el17sm | 27:a1b41626f57c | 33 | } |
| el17sm | 27:a1b41626f57c | 34 | |
| el17sm | 27:a1b41626f57c | 35 | Player::~Player() |
| el17sm | 27:a1b41626f57c | 36 | { |
| el17sm | 29:6b8411bb040a | 37 | delete_bullets(); |
| el17sm | 10:1a3499f6b583 | 38 | } |
| el17sm | 10:1a3499f6b583 | 39 | |
| el17sm | 13:d04a6caba40d | 40 | // Accessors |
| el17sm | 22:7abf4581bc9b | 41 | int Player::get_bullet_speed() |
| el17sm | 22:7abf4581bc9b | 42 | { |
| el17sm | 22:7abf4581bc9b | 43 | return _bullet_speed; |
| el17sm | 29:6b8411bb040a | 44 | } |
| el17sm | 23:5a8f75e93508 | 45 | int Player::get_hearts_width() |
| el17sm | 23:5a8f75e93508 | 46 | { |
| el17sm | 27:a1b41626f57c | 47 | return 9; |
| el17sm | 23:5a8f75e93508 | 48 | } |
| el17sm | 23:5a8f75e93508 | 49 | int Player::get_hearts_height() |
| el17sm | 23:5a8f75e93508 | 50 | { |
| el17sm | 27:a1b41626f57c | 51 | return 9; |
| el17sm | 23:5a8f75e93508 | 52 | } |
| el17sm | 33:4f3948dcd2f7 | 53 | char * Player::get_hearts_sprite() |
| el17sm | 23:5a8f75e93508 | 54 | { |
| el17sm | 33:4f3948dcd2f7 | 55 | return (char *) sprite_heart; |
| el17sm | 23:5a8f75e93508 | 56 | } |
| el17sm | 13:d04a6caba40d | 57 | |
| el17sm | 13:d04a6caba40d | 58 | // Functions |
| el17sm | 34:1d5b4da3935e | 59 | void Player::move(float mapped_x, float mapped_y, char * map, bool * doorways) |
| el17sm | 22:7abf4581bc9b | 60 | { |
| el17sm | 30:ec915d24d3e9 | 61 | move_player(mapped_x, mapped_y, map, doorways); |
| el17sm | 30:ec915d24d3e9 | 62 | move_bullets(); |
| el17sm | 30:ec915d24d3e9 | 63 | increment_frames(mapped_x, mapped_y); |
| el17sm | 30:ec915d24d3e9 | 64 | invulnerability_counter++; |
| el17sm | 30:ec915d24d3e9 | 65 | } |
| el17sm | 30:ec915d24d3e9 | 66 | |
| el17sm | 34:1d5b4da3935e | 67 | void Player::move_player(float mapped_x, float mapped_y, char * map, bool * doorways) |
| el17sm | 30:ec915d24d3e9 | 68 | { |
| el17sm | 41:0697508a28ba | 69 | update_prev_pos(); |
| el17sm | 41:0697508a28ba | 70 | position.y -= velocity*mapped_y; |
| el17sm | 41:0697508a28ba | 71 | position.x += velocity*mapped_x; |
| el17sm | 41:0697508a28ba | 72 | |
| el17sm | 41:0697508a28ba | 73 | undo_move_x(entity_to_map_collision_test(position.x, prev_pos.y, map, doorways)); |
| el17sm | 41:0697508a28ba | 74 | undo_move_y(entity_to_map_collision_test(prev_pos.x, position.y, map, doorways)); |
| el17sm | 41:0697508a28ba | 75 | |
| el17sm | 10:1a3499f6b583 | 76 | moving = false; |
| el17sm | 30:ec915d24d3e9 | 77 | } |
| el17sm | 30:ec915d24d3e9 | 78 | |
| el17sm | 30:ec915d24d3e9 | 79 | void Player::move_bullets() |
| el17sm | 30:ec915d24d3e9 | 80 | { |
| el17sm | 30:ec915d24d3e9 | 81 | for (int i = 0; i < bullets_max; i++) { |
| el17sm | 30:ec915d24d3e9 | 82 | if (valid_bullets[i]) { |
| el17sm | 30:ec915d24d3e9 | 83 | bullets_array[i]->move(get_bullet_speed(), 0, 0, (bool *) 0); |
| el17sm | 30:ec915d24d3e9 | 84 | } |
| el17sm | 30:ec915d24d3e9 | 85 | } |
| el17sm | 30:ec915d24d3e9 | 86 | } |
| el17sm | 30:ec915d24d3e9 | 87 | |
| el17sm | 30:ec915d24d3e9 | 88 | void Player::increment_frames(float mapped_x, float mapped_y) |
| el17sm | 30:ec915d24d3e9 | 89 | { |
| el17sm | 22:7abf4581bc9b | 90 | if (abs(mapped_x) + abs(mapped_y) > 0.1f) { |
| el17sm | 10:1a3499f6b583 | 91 | moving = true; |
| el17sm | 22:7abf4581bc9b | 92 | if (mapped_y < 0 && abs(mapped_y) > abs(mapped_x)) { |
| el17sm | 10:1a3499f6b583 | 93 | face = 2; |
| el17sm | 22:7abf4581bc9b | 94 | } else if (mapped_y > 0 && abs(mapped_y) > abs(mapped_x)) { |
| el17sm | 10:1a3499f6b583 | 95 | face = 0; |
| el17sm | 22:7abf4581bc9b | 96 | } else if (mapped_x > 0 && abs(mapped_x) > abs(mapped_y)) { |
| el17sm | 10:1a3499f6b583 | 97 | face = 1; |
| el17sm | 22:7abf4581bc9b | 98 | } else if (mapped_x < 0 && abs(mapped_x) > abs(mapped_y)) { |
| el17sm | 10:1a3499f6b583 | 99 | face = 3; |
| el17sm | 10:1a3499f6b583 | 100 | } |
| el17sm | 22:7abf4581bc9b | 101 | if (frame.number < frame.max) { |
| el17sm | 12:a1c1991835ca | 102 | frame.count++; |
| el17sm | 22:7abf4581bc9b | 103 | } else { |
| el17sm | 12:a1c1991835ca | 104 | frame.count = 0; |
| el17sm | 12:a1c1991835ca | 105 | } |
| el17sm | 22:7abf4581bc9b | 106 | } else { |
| el17sm | 12:a1c1991835ca | 107 | frame.count = 0; |
| el17sm | 12:a1c1991835ca | 108 | } |
| el17sm | 23:5a8f75e93508 | 109 | frame.number = (frame.count/8) % frame.max; |
| el17sm | 23:5a8f75e93508 | 110 | } |
| el17sm | 23:5a8f75e93508 | 111 | |
| el17sm | 23:5a8f75e93508 | 112 | void Player::take_damage(int damage) |
| el17sm | 23:5a8f75e93508 | 113 | { |
| el17sm | 28:98848e6a77a2 | 114 | if (damage < 0){ |
| el17sm | 28:98848e6a77a2 | 115 | hp -= damage; |
| el17sm | 28:98848e6a77a2 | 116 | } |
| el17sm | 33:4f3948dcd2f7 | 117 | else if (invulnerability_counter >= INVULNERABILITY_PERIOD) { |
| el17sm | 23:5a8f75e93508 | 118 | hp -= damage; |
| el17sm | 23:5a8f75e93508 | 119 | invulnerability_counter = 0; |
| el17sm | 23:5a8f75e93508 | 120 | } |
| el17sm | 28:98848e6a77a2 | 121 | if (hp > 5) { |
| el17sm | 28:98848e6a77a2 | 122 | hp = 5; |
| el17sm | 28:98848e6a77a2 | 123 | } |
| el17sm | 12:a1c1991835ca | 124 | } |
| el17sm | 30:ec915d24d3e9 | 125 | |
| el17sm | 50:2c5cb92a5361 | 126 | bool Player::delete_out_of_bounds_bullets(char * map, bool * doorways) |
| el17sm | 30:ec915d24d3e9 | 127 | { |
| el17sm | 30:ec915d24d3e9 | 128 | bool result = false; |
| el17sm | 30:ec915d24d3e9 | 129 | for (int i = 0; i < bullets_max; i++) { |
| el17sm | 30:ec915d24d3e9 | 130 | if((valid_bullets[i]) && (bullets_array[i]->out_of_bounds_check(map, doorways))) { |
| el17sm | 30:ec915d24d3e9 | 131 | valid_bullets[i] = false; |
| el17sm | 30:ec915d24d3e9 | 132 | delete bullets_array[i]; |
| el17sm | 30:ec915d24d3e9 | 133 | result = true; |
| el17sm | 30:ec915d24d3e9 | 134 | } |
| el17sm | 30:ec915d24d3e9 | 135 | } |
| el17sm | 30:ec915d24d3e9 | 136 | return result; |
| el17sm | 30:ec915d24d3e9 | 137 | } |
| el17sm | 30:ec915d24d3e9 | 138 | |
| el17sm | 30:ec915d24d3e9 | 139 | void Player::draw(N5110 &lcd) |
| el17sm | 30:ec915d24d3e9 | 140 | { |
| el17sm | 30:ec915d24d3e9 | 141 | draw_player(lcd); |
| el17sm | 30:ec915d24d3e9 | 142 | } |
| el17sm | 30:ec915d24d3e9 | 143 | |
| el17sm | 30:ec915d24d3e9 | 144 | void Player::draw_player(N5110 &lcd) |
| el17sm | 30:ec915d24d3e9 | 145 | { |
| el17sm | 35:06cd6be999ad | 146 | lcd.drawSpriteTransparent(position.x+sprite_size.offset_x, |
| el17sm | 35:06cd6be999ad | 147 | position.y+sprite_size.offset_y, |
| el17sm | 30:ec915d24d3e9 | 148 | sprite_size.height, |
| el17sm | 30:ec915d24d3e9 | 149 | sprite_size.width, |
| el17sm | 30:ec915d24d3e9 | 150 | get_frame()); |
| el17sm | 30:ec915d24d3e9 | 151 | } |
| el17sm | 30:ec915d24d3e9 | 152 | |
| el17sm | 40:cbcbf6fc1421 | 153 | void Player::draw_bullets(N5110 &lcd, int j) |
| el17sm | 30:ec915d24d3e9 | 154 | { |
| el17sm | 30:ec915d24d3e9 | 155 | for (int i = 0; i < bullets_max; i++) { |
| el17sm | 40:cbcbf6fc1421 | 156 | if ((valid_bullets[i]) && (bullets_array[i]->get_pos_y() == j)) { |
| el17sm | 32:fe6359ef9916 | 157 | bullets_array[i]->draw(lcd); |
| el17sm | 30:ec915d24d3e9 | 158 | } |
| el17sm | 30:ec915d24d3e9 | 159 | } |
| el17sm | 30:ec915d24d3e9 | 160 | } |
| el17sm | 30:ec915d24d3e9 | 161 | |
| el17sm | 29:6b8411bb040a | 162 | void Player::delete_bullets() |
| el17sm | 29:6b8411bb040a | 163 | { |
| el17sm | 29:6b8411bb040a | 164 | for (int i = 0; i < bullets_max; i++) { |
| el17sm | 29:6b8411bb040a | 165 | if (valid_bullets[i]) { |
| el17sm | 29:6b8411bb040a | 166 | delete bullets_array[i]; |
| el17sm | 29:6b8411bb040a | 167 | valid_bullets[i] = false; |
| el17sm | 29:6b8411bb040a | 168 | } |
| el17sm | 29:6b8411bb040a | 169 | } |
| el17sm | 29:6b8411bb040a | 170 | } |
| el17sm | 12:a1c1991835ca | 171 | |
| el17sm | 33:4f3948dcd2f7 | 172 | char * Player::get_frame() |
| el17sm | 22:7abf4581bc9b | 173 | { |
| el17sm | 33:4f3948dcd2f7 | 174 | if ((invulnerability_counter < INVULNERABILITY_PERIOD) && (invulnerability_counter % 10 <= 4)) { |
| el17sm | 33:4f3948dcd2f7 | 175 | return (char*) sprite_transparent_player; |
| el17sm | 23:5a8f75e93508 | 176 | } |
| el17sm | 33:4f3948dcd2f7 | 177 | return (char *) sprite_player[face][frame.number]; |
| el17sm | 10:1a3499f6b583 | 178 | } |
| el17sm | 10:1a3499f6b583 | 179 | |
| el17sm | 22:7abf4581bc9b | 180 | void Player::buttons(bool button_A, bool button_B, bool button_Y, bool button_X) |
| el17sm | 22:7abf4581bc9b | 181 | { |
| el17sm | 15:44d5cc33d389 | 182 | fire_rate_counter++; |
| el17sm | 22:7abf4581bc9b | 183 | if (button_Y) { |
| el17sm | 10:1a3499f6b583 | 184 | face = 0; |
| el17sm | 22:7abf4581bc9b | 185 | } else if (button_B) { |
| el17sm | 10:1a3499f6b583 | 186 | face = 1; |
| el17sm | 22:7abf4581bc9b | 187 | } else if (button_A) { |
| el17sm | 10:1a3499f6b583 | 188 | face = 2; |
| el17sm | 22:7abf4581bc9b | 189 | } else if (button_X) { |
| el17sm | 10:1a3499f6b583 | 190 | face = 3; |
| el17sm | 10:1a3499f6b583 | 191 | } |
| el17sm | 22:7abf4581bc9b | 192 | if (button_Y || button_B || button_A || button_X) { |
| el17sm | 22:7abf4581bc9b | 193 | for (int i = 0; i < bullets_max; i++) { |
| el17sm | 22:7abf4581bc9b | 194 | if (!valid_bullets[i] && (fire_rate_counter >= fire_rate_delay)) { |
| el17sm | 41:0697508a28ba | 195 | bullets_array[i] = new Bullets(position.x+2, position.y+2, face); |
| el17sm | 14:3361879490b2 | 196 | valid_bullets[i] = true; |
| el17sm | 15:44d5cc33d389 | 197 | fire_rate_counter = 0; |
| el17sm | 14:3361879490b2 | 198 | break; |
| el17sm | 14:3361879490b2 | 199 | } |
| el17sm | 13:d04a6caba40d | 200 | } |
| el17sm | 13:d04a6caba40d | 201 | } |
| el17sm | 10:1a3499f6b583 | 202 | } |