A rouge-like rpg, heavily inspired on the binding of isaac. Running on a FRDM-K64F Mbed board. C++.

Dependencies:   mbed MotionSensor

Committer:
el17sm
Date:
Thu May 09 14:56:46 2019 +0000
Revision:
61:901871a7c6ff
Parent:
57:1c12361b6e3d
Final Submission. I have read and agreed with Statement of Academic Integrity.

Who changed what in which revision?

UserRevisionLine numberNew 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 57:1c12361b6e3d 7 _hp = 3;
el17sm 57:1c12361b6e3d 8 _attack = 1;
el17sm 57:1c12361b6e3d 9 _face = 2;
el17sm 51:4d0cd75e7ed3 10
el17sm 57:1c12361b6e3d 11 _hitbox.width = 6;
el17sm 57:1c12361b6e3d 12 _hitbox.height = 5;
el17sm 51:4d0cd75e7ed3 13
el17sm 57:1c12361b6e3d 14 _position.x = pos_x;
el17sm 57:1c12361b6e3d 15 _position.y = pos_y;
el17sm 51:4d0cd75e7ed3 16
el17sm 57:1c12361b6e3d 17 _sprite_size.width = 6;
el17sm 57:1c12361b6e3d 18 _sprite_size.height = 12;
el17sm 57:1c12361b6e3d 19 _sprite_size.offset_x = 0;
el17sm 57:1c12361b6e3d 20 _sprite_size.offset_y = -7;
el17sm 51:4d0cd75e7ed3 21
el17sm 57:1c12361b6e3d 22 _frame.count = 0;
el17sm 57:1c12361b6e3d 23 _frame.number = 0;
el17sm 57:1c12361b6e3d 24 _frame.max = 4;
el17sm 51:4d0cd75e7ed3 25
el17sm 22:7abf4581bc9b 26 for (int i = 0; i < bullets_max; i++) {
el17sm 22:7abf4581bc9b 27 valid_bullets[i] = false;
el17sm 22:7abf4581bc9b 28 }
el17sm 33:4f3948dcd2f7 29
el17sm 57:1c12361b6e3d 30 _invulnerability_counter = INVULNERABILITY_PERIOD;
el17sm 22:7abf4581bc9b 31
el17sm 16:ddb203a74dfc 32 // Upgradable status
el17sm 57:1c12361b6e3d 33 _fire_rate_delay = 30;
el17sm 57:1c12361b6e3d 34 _fire_rate_counter = _fire_rate_delay;
el17sm 57:1c12361b6e3d 35 _velocity = 0.7;
el17sm 23:5a8f75e93508 36 _bullet_speed = 1;
el17sm 27:a1b41626f57c 37 }
el17sm 27:a1b41626f57c 38
el17sm 27:a1b41626f57c 39 Player::~Player()
el17sm 27:a1b41626f57c 40 {
el17sm 29:6b8411bb040a 41 delete_bullets();
el17sm 10:1a3499f6b583 42 }
el17sm 10:1a3499f6b583 43
el17sm 13:d04a6caba40d 44 // Accessors
el17sm 22:7abf4581bc9b 45 int Player::get_bullet_speed()
el17sm 22:7abf4581bc9b 46 {
el17sm 22:7abf4581bc9b 47 return _bullet_speed;
el17sm 29:6b8411bb040a 48 }
el17sm 23:5a8f75e93508 49 int Player::get_hearts_width()
el17sm 23:5a8f75e93508 50 {
el17sm 27:a1b41626f57c 51 return 9;
el17sm 23:5a8f75e93508 52 }
el17sm 23:5a8f75e93508 53 int Player::get_hearts_height()
el17sm 23:5a8f75e93508 54 {
el17sm 27:a1b41626f57c 55 return 9;
el17sm 23:5a8f75e93508 56 }
el17sm 33:4f3948dcd2f7 57 char * Player::get_hearts_sprite()
el17sm 23:5a8f75e93508 58 {
el17sm 33:4f3948dcd2f7 59 return (char *) sprite_heart;
el17sm 23:5a8f75e93508 60 }
el17sm 13:d04a6caba40d 61
el17sm 13:d04a6caba40d 62 // Functions
el17sm 52:7d05e5472022 63 void Player::move(float mapped_x, float mapped_y, char * map, bool * doorways) // Update all bullet movement and player movement, also takes care of animation
el17sm 22:7abf4581bc9b 64 {
el17sm 30:ec915d24d3e9 65 move_player(mapped_x, mapped_y, map, doorways);
el17sm 30:ec915d24d3e9 66 move_bullets();
el17sm 52:7d05e5472022 67 increment_frames(mapped_x, mapped_y); // Sets the face of the person, and increment frame count
el17sm 57:1c12361b6e3d 68 _invulnerability_counter++; // for damage checking
el17sm 30:ec915d24d3e9 69 }
el17sm 30:ec915d24d3e9 70
el17sm 52:7d05e5472022 71 void Player::move_player(float mapped_x, float mapped_y, char * map, bool * doorways) // Moves the player unless if the player walks onto a wall
el17sm 30:ec915d24d3e9 72 {
el17sm 41:0697508a28ba 73 update_prev_pos();
el17sm 57:1c12361b6e3d 74 _position.y -= _velocity*mapped_y;
el17sm 57:1c12361b6e3d 75 _position.x += _velocity*mapped_x;
el17sm 41:0697508a28ba 76
el17sm 57:1c12361b6e3d 77 undo_move_x(entity_to_map_collision_test(_position.x, _prev_pos.y, map, doorways));
el17sm 57:1c12361b6e3d 78 undo_move_y(entity_to_map_collision_test(_prev_pos.x, _position.y, map, doorways));
el17sm 30:ec915d24d3e9 79 }
el17sm 30:ec915d24d3e9 80
el17sm 52:7d05e5472022 81 void Player::move_bullets() // For each bullet, move them
el17sm 30:ec915d24d3e9 82 {
el17sm 30:ec915d24d3e9 83 for (int i = 0; i < bullets_max; i++) {
el17sm 30:ec915d24d3e9 84 if (valid_bullets[i]) {
el17sm 30:ec915d24d3e9 85 bullets_array[i]->move(get_bullet_speed(), 0, 0, (bool *) 0);
el17sm 30:ec915d24d3e9 86 }
el17sm 30:ec915d24d3e9 87 }
el17sm 30:ec915d24d3e9 88 }
el17sm 30:ec915d24d3e9 89
el17sm 30:ec915d24d3e9 90 void Player::increment_frames(float mapped_x, float mapped_y)
el17sm 30:ec915d24d3e9 91 {
el17sm 52:7d05e5472022 92 if (abs(mapped_x) + abs(mapped_y) > 0.1f) { // If player is moving
el17sm 22:7abf4581bc9b 93 if (mapped_y < 0 && abs(mapped_y) > abs(mapped_x)) {
el17sm 57:1c12361b6e3d 94 _face = 2;
el17sm 22:7abf4581bc9b 95 } else if (mapped_y > 0 && abs(mapped_y) > abs(mapped_x)) {
el17sm 57:1c12361b6e3d 96 _face = 0;
el17sm 22:7abf4581bc9b 97 } else if (mapped_x > 0 && abs(mapped_x) > abs(mapped_y)) {
el17sm 57:1c12361b6e3d 98 _face = 1;
el17sm 22:7abf4581bc9b 99 } else if (mapped_x < 0 && abs(mapped_x) > abs(mapped_y)) {
el17sm 57:1c12361b6e3d 100 _face = 3;
el17sm 10:1a3499f6b583 101 }
el17sm 57:1c12361b6e3d 102 if (_frame.number < _frame.max) { // Animate frames by incrementing and reseting frames
el17sm 57:1c12361b6e3d 103 _frame.count++;
el17sm 22:7abf4581bc9b 104 } else {
el17sm 57:1c12361b6e3d 105 _frame.count = 0;
el17sm 12:a1c1991835ca 106 }
el17sm 22:7abf4581bc9b 107 } else {
el17sm 57:1c12361b6e3d 108 _frame.count = 0; // If the player is not moving, don't animate
el17sm 12:a1c1991835ca 109 }
el17sm 57:1c12361b6e3d 110 _frame.number = (_frame.count/8) % _frame.max; // Frame number is used in chosing sprite-frame for animation; the constant 8 is the number of frames per sprite-frame
el17sm 23:5a8f75e93508 111 }
el17sm 23:5a8f75e93508 112
el17sm 52:7d05e5472022 113 void Player::take_damage(int damage) // Takes damage unless if player just got damaged within invulnerability period
el17sm 23:5a8f75e93508 114 {
el17sm 28:98848e6a77a2 115 if (damage < 0){
el17sm 57:1c12361b6e3d 116 _hp -= damage;
el17sm 28:98848e6a77a2 117 }
el17sm 57:1c12361b6e3d 118 else if (_invulnerability_counter >= INVULNERABILITY_PERIOD) {
el17sm 57:1c12361b6e3d 119 _hp -= damage;
el17sm 57:1c12361b6e3d 120 _invulnerability_counter = 0;
el17sm 23:5a8f75e93508 121 }
el17sm 57:1c12361b6e3d 122 if (_hp > 5) { // Max HP is a constant 5, this might be an upgradable status later
el17sm 57:1c12361b6e3d 123 _hp = 5;
el17sm 28:98848e6a77a2 124 }
el17sm 12:a1c1991835ca 125 }
el17sm 30:ec915d24d3e9 126
el17sm 52:7d05e5472022 127 bool Player::delete_out_of_bounds_bullets(char * map, bool * doorways) // Attempts to delete bullets that are out of bounds or colliding with the wall, returns true if any bullets are deleted
el17sm 30:ec915d24d3e9 128 {
el17sm 30:ec915d24d3e9 129 bool result = false;
el17sm 30:ec915d24d3e9 130 for (int i = 0; i < bullets_max; i++) {
el17sm 30:ec915d24d3e9 131 if((valid_bullets[i]) && (bullets_array[i]->out_of_bounds_check(map, doorways))) {
el17sm 30:ec915d24d3e9 132 valid_bullets[i] = false;
el17sm 30:ec915d24d3e9 133 delete bullets_array[i];
el17sm 30:ec915d24d3e9 134 result = true;
el17sm 30:ec915d24d3e9 135 }
el17sm 30:ec915d24d3e9 136 }
el17sm 30:ec915d24d3e9 137 return result;
el17sm 30:ec915d24d3e9 138 }
el17sm 30:ec915d24d3e9 139
el17sm 30:ec915d24d3e9 140 void Player::draw(N5110 &lcd)
el17sm 30:ec915d24d3e9 141 {
el17sm 30:ec915d24d3e9 142 draw_player(lcd);
el17sm 30:ec915d24d3e9 143 }
el17sm 30:ec915d24d3e9 144
el17sm 30:ec915d24d3e9 145 void Player::draw_player(N5110 &lcd)
el17sm 30:ec915d24d3e9 146 {
el17sm 57:1c12361b6e3d 147 lcd.drawSpriteTransparent(_position.x+_sprite_size.offset_x,
el17sm 57:1c12361b6e3d 148 _position.y+_sprite_size.offset_y,
el17sm 57:1c12361b6e3d 149 _sprite_size.height,
el17sm 57:1c12361b6e3d 150 _sprite_size.width,
el17sm 30:ec915d24d3e9 151 get_frame());
el17sm 30:ec915d24d3e9 152 }
el17sm 30:ec915d24d3e9 153
el17sm 40:cbcbf6fc1421 154 void Player::draw_bullets(N5110 &lcd, int j)
el17sm 30:ec915d24d3e9 155 {
el17sm 30:ec915d24d3e9 156 for (int i = 0; i < bullets_max; i++) {
el17sm 40:cbcbf6fc1421 157 if ((valid_bullets[i]) && (bullets_array[i]->get_pos_y() == j)) {
el17sm 32:fe6359ef9916 158 bullets_array[i]->draw(lcd);
el17sm 30:ec915d24d3e9 159 }
el17sm 30:ec915d24d3e9 160 }
el17sm 30:ec915d24d3e9 161 }
el17sm 30:ec915d24d3e9 162
el17sm 52:7d05e5472022 163 void Player::delete_bullets() // Delete all bullets, normally used in unloading
el17sm 29:6b8411bb040a 164 {
el17sm 29:6b8411bb040a 165 for (int i = 0; i < bullets_max; i++) {
el17sm 29:6b8411bb040a 166 if (valid_bullets[i]) {
el17sm 29:6b8411bb040a 167 delete bullets_array[i];
el17sm 29:6b8411bb040a 168 valid_bullets[i] = false;
el17sm 29:6b8411bb040a 169 }
el17sm 29:6b8411bb040a 170 }
el17sm 29:6b8411bb040a 171 }
el17sm 12:a1c1991835ca 172
el17sm 52:7d05e5472022 173 char * Player::get_frame() // Returns the current frame's sprite pointer
el17sm 22:7abf4581bc9b 174 {
el17sm 57:1c12361b6e3d 175 if ((_invulnerability_counter < INVULNERABILITY_PERIOD) && (_invulnerability_counter % 10 <= 4)) {
el17sm 33:4f3948dcd2f7 176 return (char*) sprite_transparent_player;
el17sm 23:5a8f75e93508 177 }
el17sm 57:1c12361b6e3d 178 return (char *) sprite_player[_face][_frame.number];
el17sm 10:1a3499f6b583 179 }
el17sm 10:1a3499f6b583 180
el17sm 52:7d05e5472022 181 void Player::buttons(bool button_A, bool button_B, bool button_Y, bool button_X) // Summons new bullets and overloads the player face when buttons are pressed
el17sm 22:7abf4581bc9b 182 {
el17sm 57:1c12361b6e3d 183 _fire_rate_counter++;
el17sm 22:7abf4581bc9b 184 if (button_Y) {
el17sm 57:1c12361b6e3d 185 _face = 0;
el17sm 22:7abf4581bc9b 186 } else if (button_B) {
el17sm 57:1c12361b6e3d 187 _face = 1;
el17sm 22:7abf4581bc9b 188 } else if (button_A) {
el17sm 57:1c12361b6e3d 189 _face = 2;
el17sm 22:7abf4581bc9b 190 } else if (button_X) {
el17sm 57:1c12361b6e3d 191 _face = 3;
el17sm 10:1a3499f6b583 192 }
el17sm 22:7abf4581bc9b 193 if (button_Y || button_B || button_A || button_X) {
el17sm 22:7abf4581bc9b 194 for (int i = 0; i < bullets_max; i++) {
el17sm 57:1c12361b6e3d 195 if (!valid_bullets[i] && (_fire_rate_counter >= _fire_rate_delay)) { // waits until _fire_rate_delay is done before creating a bullet in an invalid slot of bullet_array
el17sm 57:1c12361b6e3d 196 bullets_array[i] = new Bullets(_position.x+2, _position.y+2, _face);
el17sm 14:3361879490b2 197 valid_bullets[i] = true;
el17sm 57:1c12361b6e3d 198 _fire_rate_counter = 0;
el17sm 14:3361879490b2 199 break;
el17sm 14:3361879490b2 200 }
el17sm 13:d04a6caba40d 201 }
el17sm 13:d04a6caba40d 202 }
el17sm 10:1a3499f6b583 203 }