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:
Mon Apr 29 02:45:17 2019 +0000
Revision:
26:abbc19edc5c1
Child:
27:a1b41626f57c
RoomEngine done, no test yet, Room h partial done;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17sm 26:abbc19edc5c1 1 #include "RoomEngine.h"
el17sm 26:abbc19edc5c1 2
el17sm 26:abbc19edc5c1 3 void GameEngine::init()
el17sm 26:abbc19edc5c1 4 {
el17sm 26:abbc19edc5c1 5 Player player(39, 27);
el17sm 26:abbc19edc5c1 6 }
el17sm 26:abbc19edc5c1 7
el17sm 26:abbc19edc5c1 8 void GameEngine::read_input(Gamepad &gamepad)
el17sm 26:abbc19edc5c1 9 {
el17sm 26:abbc19edc5c1 10 _L = gamepad.check_event(Gamepad::L_PRESSED);
el17sm 26:abbc19edc5c1 11 _R = gamepad.check_event(Gamepad::R_PRESSED);
el17sm 26:abbc19edc5c1 12 _START = gamepad.check_event(Gamepad::START_PRESSED);
el17sm 26:abbc19edc5c1 13 _BACK = gamepad.check_event(Gamepad::BACK_PRESSED);
el17sm 26:abbc19edc5c1 14 _A = gamepad.check_event(Gamepad::A_PRESSED);
el17sm 26:abbc19edc5c1 15 _B = gamepad.check_event(Gamepad::B_PRESSED);
el17sm 26:abbc19edc5c1 16 _X = gamepad.check_event(Gamepad::X_PRESSED);
el17sm 26:abbc19edc5c1 17 _Y = gamepad.check_event(Gamepad::Y_PRESSED);
el17sm 26:abbc19edc5c1 18 mapped_coord = gamepad.get_mapped_coord();
el17sm 26:abbc19edc5c1 19 }
el17sm 26:abbc19edc5c1 20
el17sm 26:abbc19edc5c1 21 void GameEngine::update(N5110 &lcd)
el17sm 26:abbc19edc5c1 22 {
el17sm 26:abbc19edc5c1 23 check_damage();
el17sm 26:abbc19edc5c1 24 check_death();
el17sm 26:abbc19edc5c1 25 move();
el17sm 26:abbc19edc5c1 26 minimap_detection(lcd);
el17sm 26:abbc19edc5c1 27 pause_detection(lcd);
el17sm 26:abbc19edc5c1 28 }
el17sm 26:abbc19edc5c1 29
el17sm 26:abbc19edc5c1 30 void GameEngine::draw(N5110 &lcd)
el17sm 26:abbc19edc5c1 31 {
el17sm 26:abbc19edc5c1 32 lcd.drawSprite(0,0,screen_height,screen_width,(int *)level_map[1]);
el17sm 26:abbc19edc5c1 33 draw_player(lcd);
el17sm 26:abbc19edc5c1 34 draw_enemies(lcd);
el17sm 26:abbc19edc5c1 35 draw_bullets(lcd);
el17sm 26:abbc19edc5c1 36 draw_health(lcd);
el17sm 26:abbc19edc5c1 37 }
el17sm 26:abbc19edc5c1 38
el17sm 26:abbc19edc5c1 39 // Private Functions
el17sm 26:abbc19edc5c1 40
el17sm 26:abbc19edc5c1 41 bool GameEngine::entity_collision(Entity &a, Entity &b) // returns true if the two entity hitboxes collide
el17sm 26:abbc19edc5c1 42 {
el17sm 26:abbc19edc5c1 43 if (((b.get_pos_x() <= a.get_pos_x()) && (a.get_pos_x() <= b.get_pos_x() + b.get_hitbox_width() - 1)) ||
el17sm 26:abbc19edc5c1 44 ((b.get_pos_x() <= a.get_pos_x() + a.get_hitbox_width() - 1) && (a.get_pos_x() + a.get_hitbox_width() - 1 <= b.get_pos_x() + b.get_hitbox_width() - 1))) {
el17sm 26:abbc19edc5c1 45 if (((b.get_pos_y() <= a.get_pos_y()) && (a.get_pos_y() <= b.get_pos_y() + b.get_hitbox_height() - 1)) ||
el17sm 26:abbc19edc5c1 46 ((b.get_pos_y() <= a.get_pos_y() + a.get_hitbox_height() - 1) && (a.get_pos_y() + a.get_hitbox_height() - 1 <= b.get_pos_y() + b.get_hitbox_height() - 1))) {
el17sm 26:abbc19edc5c1 47 return true;
el17sm 26:abbc19edc5c1 48 }
el17sm 26:abbc19edc5c1 49 }
el17sm 26:abbc19edc5c1 50 return 0;
el17sm 26:abbc19edc5c1 51 }
el17sm 26:abbc19edc5c1 52
el17sm 26:abbc19edc5c1 53 // returns true if the hitbox of "entity a" collides with any hitboxes of enttities within "array" as "entity a" moves on the x direction
el17sm 26:abbc19edc5c1 54 float GameEngine::entity_move_check_x(Entity *a, Entity *array[], int no_of_enemies, int current_entity, bool valid_enemies[])
el17sm 26:abbc19edc5c1 55 {
el17sm 26:abbc19edc5c1 56 for (int i = 0; i < no_of_enemies; i++) {
el17sm 26:abbc19edc5c1 57 if (valid_enemies[i]) {
el17sm 26:abbc19edc5c1 58 if(i != current_entity) {
el17sm 26:abbc19edc5c1 59 if (((array[i]->get_prev_pos_x() <= a->get_pos_x()) && (a->get_pos_x() <= array[i]->get_prev_pos_x() + array[i]->get_hitbox_width() - 1)) ||
el17sm 26:abbc19edc5c1 60 ((array[i]->get_prev_pos_x() <= a->get_pos_x() + a->get_hitbox_width() - 1) && (a->get_pos_x() + a->get_hitbox_width() - 1 <= array[i]->get_prev_pos_x() + array[i]->get_hitbox_width() - 1))) {
el17sm 26:abbc19edc5c1 61 if (((array[i]->get_prev_pos_y() <= a->get_prev_pos_y()) && (a->get_prev_pos_y() <= array[i]->get_prev_pos_y() + array[i]->get_hitbox_height() - 1)) ||
el17sm 26:abbc19edc5c1 62 ((array[i]->get_prev_pos_y() <= a->get_prev_pos_y() + a->get_hitbox_height() - 1) && (a->get_prev_pos_y() + a->get_hitbox_height() - 1 <= array[i]->get_prev_pos_y() + array[i]->get_hitbox_height() - 1))) {
el17sm 26:abbc19edc5c1 63 return (2*((a->get_pos_x() > array[i]->get_prev_pos_x()) - 0.5));
el17sm 26:abbc19edc5c1 64 }
el17sm 26:abbc19edc5c1 65 }
el17sm 26:abbc19edc5c1 66 }
el17sm 26:abbc19edc5c1 67 }
el17sm 26:abbc19edc5c1 68 }
el17sm 26:abbc19edc5c1 69 return 0;
el17sm 26:abbc19edc5c1 70 }
el17sm 26:abbc19edc5c1 71
el17sm 26:abbc19edc5c1 72 // returns true if the hitbox of "entity a" collides with any hitboxes of enttities within "array" as "entity a" moves on the y direction
el17sm 26:abbc19edc5c1 73 float GameEngine::entity_move_check_y(Entity *a, Entity *array[], int no_of_enemies, int current_entity, bool valid_enemies[])
el17sm 26:abbc19edc5c1 74 {
el17sm 26:abbc19edc5c1 75 for (int i = 0; i < no_of_enemies; i++) {
el17sm 26:abbc19edc5c1 76 if (valid_enemies[i]) {
el17sm 26:abbc19edc5c1 77 if(i != current_entity) {
el17sm 26:abbc19edc5c1 78 if (((array[i]->get_prev_pos_x() <= a->get_prev_pos_x()) && (a->get_prev_pos_x() <= array[i]->get_prev_pos_x() + array[i]->get_hitbox_width() - 1)) ||
el17sm 26:abbc19edc5c1 79 ((array[i]->get_prev_pos_x() <= a->get_prev_pos_x() + a->get_hitbox_width() - 1) && (a->get_prev_pos_x() + a->get_hitbox_width() - 1 <= array[i]->get_prev_pos_x() + array[i]->get_hitbox_width() - 1))) {
el17sm 26:abbc19edc5c1 80 if (((array[i]->get_prev_pos_y() <= a->get_pos_y()) && (a->get_pos_y() <= array[i]->get_prev_pos_y() + array[i]->get_hitbox_height() - 1)) ||
el17sm 26:abbc19edc5c1 81 ((array[i]->get_prev_pos_y() <= a->get_pos_y() + a->get_hitbox_height() - 1) && (a->get_pos_y() + a->get_hitbox_height() - 1 <= array[i]->get_prev_pos_y() + array[i]->get_hitbox_height() - 1))) {
el17sm 26:abbc19edc5c1 82 return (2*((a->get_pos_y() > array[i]->get_prev_pos_y()) - 0.5));
el17sm 26:abbc19edc5c1 83 }
el17sm 26:abbc19edc5c1 84 }
el17sm 26:abbc19edc5c1 85 }
el17sm 26:abbc19edc5c1 86 }
el17sm 26:abbc19edc5c1 87 }
el17sm 26:abbc19edc5c1 88 return 0;
el17sm 26:abbc19edc5c1 89 }
el17sm 26:abbc19edc5c1 90
el17sm 26:abbc19edc5c1 91 void GameEngine::check_damage()
el17sm 26:abbc19edc5c1 92 {
el17sm 26:abbc19edc5c1 93 check_damage_player();
el17sm 26:abbc19edc5c1 94 check_damage_enemies();
el17sm 26:abbc19edc5c1 95 }
el17sm 26:abbc19edc5c1 96
el17sm 26:abbc19edc5c1 97 void GameEngine::check_damage_player()
el17sm 26:abbc19edc5c1 98 {
el17sm 26:abbc19edc5c1 99 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 26:abbc19edc5c1 100 if (room.valid_enemies[i]) {
el17sm 26:abbc19edc5c1 101 if(entity_collision(player, *room.enemies[i])) {
el17sm 26:abbc19edc5c1 102 player.take_damage(room.enemies[i]->get_attack());
el17sm 26:abbc19edc5c1 103 }
el17sm 26:abbc19edc5c1 104 }
el17sm 26:abbc19edc5c1 105 };
el17sm 26:abbc19edc5c1 106 }
el17sm 26:abbc19edc5c1 107
el17sm 26:abbc19edc5c1 108 void GameEngine::check_damage_enemies()
el17sm 26:abbc19edc5c1 109 {
el17sm 26:abbc19edc5c1 110 for (int i = 0; i < bullets_max; i++) {
el17sm 26:abbc19edc5c1 111 if (player.valid_bullets[i]) {
el17sm 26:abbc19edc5c1 112 if (player.bullets_array[i]->out_of_bounds_check()) {
el17sm 26:abbc19edc5c1 113 player.valid_bullets[i] = false;
el17sm 26:abbc19edc5c1 114 delete player.bullets_array[i];
el17sm 26:abbc19edc5c1 115 } else {
el17sm 26:abbc19edc5c1 116 for (int j = 0; j < MAX_ENEMIES; j++) {
el17sm 26:abbc19edc5c1 117 if (room.valid_enemies[j] && (entity_collision(*player.bullets_array[i], *room.enemies[j]))) {
el17sm 26:abbc19edc5c1 118 room.enemies[j]->take_damage(player.get_attack());
el17sm 26:abbc19edc5c1 119 player.valid_bullets[i] = false;
el17sm 26:abbc19edc5c1 120 delete player.bullets_array[i];
el17sm 26:abbc19edc5c1 121 break;
el17sm 26:abbc19edc5c1 122 }
el17sm 26:abbc19edc5c1 123 }
el17sm 26:abbc19edc5c1 124 }
el17sm 26:abbc19edc5c1 125 }
el17sm 26:abbc19edc5c1 126 }
el17sm 26:abbc19edc5c1 127 }
el17sm 26:abbc19edc5c1 128
el17sm 26:abbc19edc5c1 129 void GameEngine::check_death()
el17sm 26:abbc19edc5c1 130 {
el17sm 26:abbc19edc5c1 131 // Player Death
el17sm 26:abbc19edc5c1 132 if (player.get_hp() <= 0) {
el17sm 26:abbc19edc5c1 133 }
el17sm 26:abbc19edc5c1 134 // Enemy Death
el17sm 26:abbc19edc5c1 135 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 26:abbc19edc5c1 136 if (room.valid_enemies[i]) {
el17sm 26:abbc19edc5c1 137 if(room.enemies[i]->get_hp() <= 0) {
el17sm 26:abbc19edc5c1 138 room.valid_enemies[i] = false;
el17sm 26:abbc19edc5c1 139 delete room.enemies[i];
el17sm 26:abbc19edc5c1 140 }
el17sm 26:abbc19edc5c1 141 }
el17sm 26:abbc19edc5c1 142 }
el17sm 26:abbc19edc5c1 143 }
el17sm 26:abbc19edc5c1 144
el17sm 26:abbc19edc5c1 145 void GameEngine::move()
el17sm 26:abbc19edc5c1 146 {
el17sm 26:abbc19edc5c1 147 move_player();
el17sm 26:abbc19edc5c1 148 move_enemies();
el17sm 26:abbc19edc5c1 149 move_bullets();
el17sm 26:abbc19edc5c1 150 }
el17sm 26:abbc19edc5c1 151
el17sm 26:abbc19edc5c1 152 void GameEngine::move_player()
el17sm 26:abbc19edc5c1 153 {
el17sm 26:abbc19edc5c1 154 player.move(mapped_coord.x, mapped_coord.y);
el17sm 26:abbc19edc5c1 155 }
el17sm 26:abbc19edc5c1 156
el17sm 26:abbc19edc5c1 157 void GameEngine::move_enemies()
el17sm 26:abbc19edc5c1 158 {
el17sm 26:abbc19edc5c1 159 // Actual Movement of Enemies
el17sm 26:abbc19edc5c1 160 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 26:abbc19edc5c1 161 if (room.valid_enemies[i]) {
el17sm 26:abbc19edc5c1 162 room.enemies[i]->update_prev_pos();
el17sm 26:abbc19edc5c1 163 room.enemies[i]->move(player.get_pos_x(), player.get_pos_y());
el17sm 26:abbc19edc5c1 164 }
el17sm 26:abbc19edc5c1 165 };
el17sm 26:abbc19edc5c1 166 // Entity Collision Repulsion
el17sm 26:abbc19edc5c1 167 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 26:abbc19edc5c1 168 if (room.valid_enemies[i]) {
el17sm 26:abbc19edc5c1 169 room.enemies[i]->position_add_x(entity_move_check_x(room.enemies[i], room.enemies, MAX_ENEMIES, i, room.valid_enemies));
el17sm 26:abbc19edc5c1 170 room.enemies[i]->position_add_y(entity_move_check_y(room.enemies[i], room.enemies, MAX_ENEMIES, i, room.valid_enemies));
el17sm 26:abbc19edc5c1 171 }
el17sm 26:abbc19edc5c1 172 };
el17sm 26:abbc19edc5c1 173 }
el17sm 26:abbc19edc5c1 174
el17sm 26:abbc19edc5c1 175 void GameEngine::move_bullets()
el17sm 26:abbc19edc5c1 176 {
el17sm 26:abbc19edc5c1 177 for (int i = 0; i < bullets_max; i++) {
el17sm 26:abbc19edc5c1 178 if (player.valid_bullets[i]) {
el17sm 26:abbc19edc5c1 179 player.bullets_array[i]->move(player.get_bullet_speed(), 0);
el17sm 26:abbc19edc5c1 180 }
el17sm 26:abbc19edc5c1 181 };
el17sm 26:abbc19edc5c1 182 }
el17sm 26:abbc19edc5c1 183
el17sm 26:abbc19edc5c1 184 void GameEngine::minimap_detection(N5110 &lcd)
el17sm 26:abbc19edc5c1 185 {
el17sm 26:abbc19edc5c1 186 while(_BACK) {
el17sm 26:abbc19edc5c1 187 wait(0.05);
el17sm 26:abbc19edc5c1 188 lcd.clear();
el17sm 26:abbc19edc5c1 189 };
el17sm 26:abbc19edc5c1 190 }
el17sm 26:abbc19edc5c1 191
el17sm 26:abbc19edc5c1 192 void GameEngine::pause_detection(N5110 &lcd)
el17sm 26:abbc19edc5c1 193 {
el17sm 26:abbc19edc5c1 194 if(_START) {
el17sm 26:abbc19edc5c1 195 lcd.drawSpriteTransparent(0,
el17sm 26:abbc19edc5c1 196 0,
el17sm 26:abbc19edc5c1 197 player.get_hearts_height(),
el17sm 26:abbc19edc5c1 198 player.get_hearts_width(),
el17sm 26:abbc19edc5c1 199 player.get_hearts_sprite());
el17sm 26:abbc19edc5c1 200 int * paused_screen = lcd.readScreen();
el17sm 26:abbc19edc5c1 201 int pause_timer = 2;
el17sm 26:abbc19edc5c1 202 lcd.drawSpriteTransparent(20, 20, 9, 45, (int *)pause_sprite);
el17sm 26:abbc19edc5c1 203 wait(0.05);
el17sm 26:abbc19edc5c1 204 while(_START) {
el17sm 26:abbc19edc5c1 205 lcd.clear();
el17sm 26:abbc19edc5c1 206 lcd.drawSprite(0, 0, HEIGHT, WIDTH, paused_screen);
el17sm 26:abbc19edc5c1 207 if (pause_timer % 10 <= 4) {
el17sm 26:abbc19edc5c1 208 lcd.drawSpriteTransparent(20, 20, 9, 45, (int *)pause_sprite);
el17sm 26:abbc19edc5c1 209 }
el17sm 26:abbc19edc5c1 210 lcd.refresh();
el17sm 26:abbc19edc5c1 211 pause_timer++;
el17sm 26:abbc19edc5c1 212 wait_ms(1000/40);
el17sm 26:abbc19edc5c1 213 };
el17sm 26:abbc19edc5c1 214 wait(0.05);
el17sm 26:abbc19edc5c1 215 pause_timer += 2;
el17sm 26:abbc19edc5c1 216 while(!_START) {
el17sm 26:abbc19edc5c1 217 lcd.clear();
el17sm 26:abbc19edc5c1 218 lcd.drawSprite(0, 0, HEIGHT, WIDTH, paused_screen);
el17sm 26:abbc19edc5c1 219 if (pause_timer % 10 <= 4) {
el17sm 26:abbc19edc5c1 220 lcd.drawSpriteTransparent(20, 20, 9, 45, (int *)pause_sprite);
el17sm 26:abbc19edc5c1 221 }
el17sm 26:abbc19edc5c1 222 lcd.refresh();
el17sm 26:abbc19edc5c1 223 pause_timer++;
el17sm 26:abbc19edc5c1 224 wait_ms(1000/40);
el17sm 26:abbc19edc5c1 225 };
el17sm 26:abbc19edc5c1 226 wait(0.05);
el17sm 26:abbc19edc5c1 227 pause_timer += 2;
el17sm 26:abbc19edc5c1 228 while(_START) {
el17sm 26:abbc19edc5c1 229 lcd.clear();
el17sm 26:abbc19edc5c1 230 lcd.drawSprite(0, 0, HEIGHT, WIDTH, paused_screen);
el17sm 26:abbc19edc5c1 231 if (pause_timer % 10 <= 4) {
el17sm 26:abbc19edc5c1 232 lcd.drawSpriteTransparent(20, 20, 9, 45, (int *)pause_sprite);
el17sm 26:abbc19edc5c1 233 }
el17sm 26:abbc19edc5c1 234 lcd.refresh();
el17sm 26:abbc19edc5c1 235 pause_timer++;
el17sm 26:abbc19edc5c1 236 wait_ms(1000/40);
el17sm 26:abbc19edc5c1 237 };
el17sm 26:abbc19edc5c1 238 }
el17sm 26:abbc19edc5c1 239 }
el17sm 26:abbc19edc5c1 240
el17sm 26:abbc19edc5c1 241 void GameEngine::draw_player(N5110 &lcd)
el17sm 26:abbc19edc5c1 242 {
el17sm 26:abbc19edc5c1 243 lcd.drawSpriteTransparent(player.get_pos_x()-player.get_offset_x(),
el17sm 26:abbc19edc5c1 244 player.get_pos_y()-player.get_offset_y(),
el17sm 26:abbc19edc5c1 245 player.get_sprite_height(),
el17sm 26:abbc19edc5c1 246 player.get_sprite_width(),
el17sm 26:abbc19edc5c1 247 player.get_frame());
el17sm 26:abbc19edc5c1 248 }
el17sm 26:abbc19edc5c1 249
el17sm 26:abbc19edc5c1 250 void GameEngine::draw_enemies(N5110 &lcd)
el17sm 26:abbc19edc5c1 251 {
el17sm 26:abbc19edc5c1 252 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 26:abbc19edc5c1 253 if (room.valid_enemies[i]) {
el17sm 26:abbc19edc5c1 254 lcd.drawSpriteTransparent(room.enemies[i]->get_pos_x()-room.enemies[i]->get_offset_x(),
el17sm 26:abbc19edc5c1 255 room.enemies[i]->get_pos_y()-room.enemies[i]->get_offset_y(),
el17sm 26:abbc19edc5c1 256 room.enemies[i]->get_sprite_height(),
el17sm 26:abbc19edc5c1 257 room.enemies[i]->get_sprite_width(),
el17sm 26:abbc19edc5c1 258 room.enemies[i]->get_frame());
el17sm 26:abbc19edc5c1 259 }
el17sm 26:abbc19edc5c1 260 };
el17sm 26:abbc19edc5c1 261 }
el17sm 26:abbc19edc5c1 262
el17sm 26:abbc19edc5c1 263 void GameEngine::draw_bullets(N5110 &lcd)
el17sm 26:abbc19edc5c1 264 {
el17sm 26:abbc19edc5c1 265 for (int i = 0; i < bullets_max; i++) {
el17sm 26:abbc19edc5c1 266 if (player.valid_bullets[i]) {
el17sm 26:abbc19edc5c1 267 lcd.drawSpriteTransparent(player.bullets_array[i]->get_pos_x()-player.bullets_array[i]->get_offset_x(),
el17sm 26:abbc19edc5c1 268 player.bullets_array[i]->get_pos_y()-player.bullets_array[i]->get_offset_y(),
el17sm 26:abbc19edc5c1 269 player.bullets_array[i]->get_sprite_height(),
el17sm 26:abbc19edc5c1 270 player.bullets_array[i]->get_sprite_width(),
el17sm 26:abbc19edc5c1 271 player.bullets_array[i]->get_frame());
el17sm 26:abbc19edc5c1 272 }
el17sm 26:abbc19edc5c1 273 };
el17sm 26:abbc19edc5c1 274 }
el17sm 26:abbc19edc5c1 275
el17sm 26:abbc19edc5c1 276 void GameEngine::draw_health(N5110 &lcd)
el17sm 26:abbc19edc5c1 277 {
el17sm 26:abbc19edc5c1 278 lcd.drawSpriteTransparent(0,
el17sm 26:abbc19edc5c1 279 0,
el17sm 26:abbc19edc5c1 280 player.get_hearts_height(),
el17sm 26:abbc19edc5c1 281 player.get_hearts_width(),
el17sm 26:abbc19edc5c1 282 player.get_hearts_sprite());
el17sm 26:abbc19edc5c1 283 }