Steven Mahasin / Mbed 2 deprecated DreamDungeon

Dependencies:   mbed MotionSensor

Committer:
el17sm
Date:
Tue May 07 17:02:30 2019 +0000
Revision:
41:0697508a28ba
Parent:
40:cbcbf6fc1421
Child:
50:2c5cb92a5361
Added room types and wall entity

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 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 34:1d5b4da3935e 126 bool Player::update_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 }