Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Tue Apr 30 19:24:41 2019 +0000
Revision:
34:754915ce9de5
Parent:
33:c623c6d5ed16
Child:
35:172db1608332
Finished the boss class. added additional comments Have fixed the high score problem.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Noximilien 33:c623c6d5ed16 1 #ifndef BOSS_H
Noximilien 33:c623c6d5ed16 2 #define BOSS_H
Noximilien 33:c623c6d5ed16 3
Noximilien 33:c623c6d5ed16 4 #include "constants.h"
Noximilien 34:754915ce9de5 5 #include "player.h"
Noximilien 34:754915ce9de5 6 #include "stars.h"
Noximilien 33:c623c6d5ed16 7
Noximilien 34:754915ce9de5 8 /**
Noximilien 34:754915ce9de5 9 * Boss Class
Noximilien 34:754915ce9de5 10 * @brief A class to describe the states of the boss ship.
Noximilien 34:754915ce9de5 11 * @author Dmitrijs Griskovs
Noximilien 34:754915ce9de5 12 * @date 30/04/2019
Noximilien 34:754915ce9de5 13 */
Noximilien 33:c623c6d5ed16 14 class Boss : public GameObject {
Noximilien 33:c623c6d5ed16 15 public:
Noximilien 33:c623c6d5ed16 16 /**
Noximilien 33:c623c6d5ed16 17 * @var static const int max_boss_blasts variable;
Noximilien 33:c623c6d5ed16 18 * @brief Sets the limit of maximum boss blasts on the screen.
Noximilien 33:c623c6d5ed16 19 */
Noximilien 33:c623c6d5ed16 20 static const int max_boss_blasts = 5;
Noximilien 33:c623c6d5ed16 21
Noximilien 33:c623c6d5ed16 22
Noximilien 34:754915ce9de5 23 GameObject boss_blasts[max_boss_blasts];
Noximilien 33:c623c6d5ed16 24 CircleBounds boss_bounds;
Noximilien 33:c623c6d5ed16 25 CircleBounds boss_blast_bounds;
Noximilien 34:754915ce9de5 26
Noximilien 34:754915ce9de5 27 /**
Noximilien 34:754915ce9de5 28 * Constructor
Noximilien 34:754915ce9de5 29 * Sets values for the boss' sprite body circle area, the blast circle
Noximilien 34:754915ce9de5 30 * area and the circle radius for collsion callculations. Also, resets the
Noximilien 34:754915ce9de5 31 * cutscene.
Noximilien 34:754915ce9de5 32 */
Noximilien 33:c623c6d5ed16 33 Boss() {
Noximilien 33:c623c6d5ed16 34 boss_bounds.center.x = 5;
Noximilien 33:c623c6d5ed16 35 boss_bounds.center.y = 8;
Noximilien 33:c623c6d5ed16 36 boss_bounds.radius = 10;
Noximilien 33:c623c6d5ed16 37
Noximilien 34:754915ce9de5 38 boss_blast_bounds.center.x = 1;
Noximilien 34:754915ce9de5 39 boss_blast_bounds.center.y = 0;
Noximilien 33:c623c6d5ed16 40 boss_blast_bounds.radius = 1;
Noximilien 33:c623c6d5ed16 41
Noximilien 34:754915ce9de5 42 switch_boss_y_dir = true;
Noximilien 34:754915ce9de5 43 animation_counter = 0;
Noximilien 34:754915ce9de5 44 resetCutscene();
Noximilien 33:c623c6d5ed16 45 }
Noximilien 33:c623c6d5ed16 46
Noximilien 34:754915ce9de5 47 bool fireNewBlast(int x, int y) {
Noximilien 33:c623c6d5ed16 48 // Search the array of blasts if inactive we can use it.
Noximilien 33:c623c6d5ed16 49 int found = -1;
Noximilien 33:c623c6d5ed16 50 for (int i = 0; i < max_boss_blasts; ++i) {
Noximilien 34:754915ce9de5 51 if (!boss_blasts[i].active) {
Noximilien 33:c623c6d5ed16 52 found = i;
Noximilien 33:c623c6d5ed16 53 break;
Noximilien 33:c623c6d5ed16 54 }
Noximilien 33:c623c6d5ed16 55 }
Noximilien 33:c623c6d5ed16 56 if (found != -1) {
Noximilien 34:754915ce9de5 57 boss_blasts[found].active = true;
Noximilien 34:754915ce9de5 58 boss_blasts[found].pos.x = x;
Noximilien 34:754915ce9de5 59 boss_blasts[found].pos.y = y;
Noximilien 34:754915ce9de5 60 gamepad.tone(500,0.1);
Noximilien 34:754915ce9de5 61 return true;
Noximilien 33:c623c6d5ed16 62 }
Noximilien 34:754915ce9de5 63 return false;
Noximilien 33:c623c6d5ed16 64 }
Noximilien 33:c623c6d5ed16 65
Noximilien 33:c623c6d5ed16 66 void updateAndDrawBossBlasts() {
Noximilien 33:c623c6d5ed16 67 for (int i = 0; i < max_boss_blasts; ++i) {
Noximilien 34:754915ce9de5 68 if (boss_blasts[i].active) {
Noximilien 34:754915ce9de5 69 boss_blasts[i].pos.x -= boss_blast_speed;
Noximilien 34:754915ce9de5 70 if (boss_blasts[i].pos.x <= 0){
Noximilien 34:754915ce9de5 71 boss_blasts[i].active = false;
Noximilien 34:754915ce9de5 72 continue;
Noximilien 33:c623c6d5ed16 73 }
Noximilien 34:754915ce9de5 74 drawSprite(boss_blasts[i].pos, blast_sprite);
Noximilien 33:c623c6d5ed16 75 }
Noximilien 33:c623c6d5ed16 76 }
Noximilien 33:c623c6d5ed16 77 }
Noximilien 33:c623c6d5ed16 78
Noximilien 34:754915ce9de5 79 bool updateAndDrawBoss(){
Noximilien 33:c623c6d5ed16 80 if(switch_boss_y_dir) {
Noximilien 33:c623c6d5ed16 81 pos.y += 1;
Noximilien 33:c623c6d5ed16 82 }
Noximilien 33:c623c6d5ed16 83 else {
Noximilien 33:c623c6d5ed16 84 pos.y -= 1;
Noximilien 33:c623c6d5ed16 85 }
Noximilien 33:c623c6d5ed16 86 if (pos.y >= (game_area_height - enemy1_height)){
Noximilien 33:c623c6d5ed16 87 switch_boss_y_dir = false;
Noximilien 33:c623c6d5ed16 88 }
Noximilien 33:c623c6d5ed16 89 else if (pos.y <= game_area_y){
Noximilien 33:c623c6d5ed16 90 switch_boss_y_dir = true;
Noximilien 33:c623c6d5ed16 91 }
Noximilien 34:754915ce9de5 92 blast_countdown -= 1;
Noximilien 34:754915ce9de5 93 if (blast_countdown <= 0) {
Noximilien 34:754915ce9de5 94 fireNewBlast(pos.x, pos.y + 2);
Noximilien 34:754915ce9de5 95 fireNewBlast(pos.x, pos.y + enemy1_height - 2);
Noximilien 34:754915ce9de5 96 blast_countdown = 10;
Noximilien 34:754915ce9de5 97 }
Noximilien 34:754915ce9de5 98 if(!dead() && active){ draw();}
Noximilien 34:754915ce9de5 99 else{
Noximilien 34:754915ce9de5 100 GameGlobals::game_score += 300;
Noximilien 34:754915ce9de5 101 GameGlobals::score_count_for_boss_mode = 0;
Noximilien 34:754915ce9de5 102 active = false;
Noximilien 34:754915ce9de5 103 lcd.normalMode();
Noximilien 34:754915ce9de5 104 }
Noximilien 34:754915ce9de5 105 return active;
Noximilien 33:c623c6d5ed16 106 }
Noximilien 33:c623c6d5ed16 107
Noximilien 33:c623c6d5ed16 108 void draw() {
Noximilien 34:754915ce9de5 109 drawSpriteOnTop(pos, enemy1_sprite);
Noximilien 33:c623c6d5ed16 110 }
Noximilien 34:754915ce9de5 111
Noximilien 34:754915ce9de5 112 void updateCutscene() {
Noximilien 34:754915ce9de5 113 if (!started_cutscene) {
Noximilien 34:754915ce9de5 114 started_cutscene = true;
Noximilien 34:754915ce9de5 115 pos.y = screen_height/2 - (enemy1_height/2);
Noximilien 34:754915ce9de5 116 pos.x = screen_width;
Noximilien 34:754915ce9de5 117 animation_counter = 0;
Noximilien 34:754915ce9de5 118 active = true;
Noximilien 34:754915ce9de5 119 boss_lives = 7;
Noximilien 34:754915ce9de5 120 return;
Noximilien 34:754915ce9de5 121 }
Noximilien 34:754915ce9de5 122 if (animation_counter < animation_length) {
Noximilien 34:754915ce9de5 123 pos.x -= 1;
Noximilien 34:754915ce9de5 124 animation_counter++;
Noximilien 34:754915ce9de5 125 }
Noximilien 34:754915ce9de5 126 }
Noximilien 34:754915ce9de5 127
Noximilien 34:754915ce9de5 128 void resetCutscene() { started_cutscene = false; }
Noximilien 34:754915ce9de5 129 bool isFinishedCutscene() { return animation_counter >= animation_length; }
Noximilien 34:754915ce9de5 130 int boss_lives;
Noximilien 33:c623c6d5ed16 131 private:
Noximilien 34:754915ce9de5 132 static const int boss_y_speed = 2;
Noximilien 34:754915ce9de5 133 static const int boss_blast_speed = 4;
Noximilien 34:754915ce9de5 134 bool dead(){return boss_lives == 0;}
Noximilien 34:754915ce9de5 135 bool started_cutscene;
Noximilien 33:c623c6d5ed16 136 bool switch_boss_y_dir;
Noximilien 34:754915ce9de5 137 int blast_countdown;
Noximilien 34:754915ce9de5 138 int animation_counter;
Noximilien 34:754915ce9de5 139 static const int animation_length = 20;
Noximilien 33:c623c6d5ed16 140 };
Noximilien 33:c623c6d5ed16 141
Noximilien 33:c623c6d5ed16 142 #endif