Initial publish
Dependencies: mbed
Fork of el17dg by
game/boss.h@34:754915ce9de5, 2019-04-30 (annotated)
- 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?
User | Revision | Line number | New 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 |