ELEC2645 (2018/19) / Mbed 2 deprecated el17m2h_public

Dependencies:   mbed

Committer:
el17m2h
Date:
Wed May 08 18:02:11 2019 +0000
Revision:
28:e0161a52a8b9
Parent:
27:af14fcd5a520
Child:
29:15e9640646b7
Added a get function to the engine in order to be able to call the final score on the main.cpp to display on the game over screen function.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17m2h 2:360a6c301a4e 1 #ifndef ENGINE_H
el17m2h 2:360a6c301a4e 2 #define ENGINE_H
el17m2h 2:360a6c301a4e 3
el17m2h 22:0d2ac98a8b48 4 #include <iostream>
el17m2h 2:360a6c301a4e 5 #include "mbed.h"
el17m2h 2:360a6c301a4e 6 #include "N5110.h"
el17m2h 2:360a6c301a4e 7 #include "Gamepad.h"
el17m2h 2:360a6c301a4e 8 #include "Floors.h"
el17m2h 4:8ec314f806ae 9 #include "Doodler.h"
el17m2h 17:74de8c17ddac 10 #include "Bullet.h"
el17m2h 2:360a6c301a4e 11
el17m2h 24:67dc71a8f009 12 /** Engine class
el17m2h 24:67dc71a8f009 13 @brief Class for the engine of the game
el17m2h 24:67dc71a8f009 14 @author Melissa Hartmann
el17m2h 24:67dc71a8f009 15 @date May 2019
el17m2h 24:67dc71a8f009 16 */
el17m2h 2:360a6c301a4e 17 class Engine{
el17m2h 2:360a6c301a4e 18 public:
el17m2h 2:360a6c301a4e 19 Engine();
el17m2h 2:360a6c301a4e 20 ~Engine();
el17m2h 24:67dc71a8f009 21
el17m2h 24:67dc71a8f009 22 /**
el17m2h 26:d16a5b1e0ace 23 @brief Initializing game
el17m2h 26:d16a5b1e0ace 24 @details The function defines the screen's size, and the initial position of the doodler,
el17m2h 26:d16a5b1e0ace 25 the bullet and the 6 floors. This is done by adding the functions of initialization to the
el17m2h 26:d16a5b1e0ace 26 corresponding class. A for loop is used to repeat the process to create 6 floors, by defining
el17m2h 26:d16a5b1e0ace 27 them as an array of 6 objects.
el17m2h 24:67dc71a8f009 28 */
el17m2h 26:d16a5b1e0ace 29 void init();
el17m2h 24:67dc71a8f009 30
el17m2h 24:67dc71a8f009 31 /**
el17m2h 26:d16a5b1e0ace 32 @brief Initializes the screen's size and the initial score
el17m2h 26:d16a5b1e0ace 33 @details The function defines the screen's position, height and width (which remains the same
el17m2h 26:d16a5b1e0ace 34 throughout the game). It also sets an initial score of 0.
el17m2h 24:67dc71a8f009 35 */
el17m2h 23:9be87557b89a 36 void screen_init();
el17m2h 24:67dc71a8f009 37
el17m2h 24:67dc71a8f009 38 /**
el17m2h 26:d16a5b1e0ace 39 @brief Sets the inputed gamepad parameters
el17m2h 26:d16a5b1e0ace 40 @param Gamepad &pad
el17m2h 26:d16a5b1e0ace 41 @details The function sets the inputed gamepad parameters for the direction of the joystick,
el17m2h 26:d16a5b1e0ace 42 the magnitude at which the joystick is moved and checks if the button Y is pressed.
el17m2h 24:67dc71a8f009 43 */
el17m2h 5:8814d6de77d0 44 void read_input(Gamepad &pad);
el17m2h 24:67dc71a8f009 45
el17m2h 24:67dc71a8f009 46 /**
el17m2h 26:d16a5b1e0ace 47 @brief Prints the doodler, floors and bullet
el17m2h 26:d16a5b1e0ace 48 @param N5110 &lcd
el17m2h 26:d16a5b1e0ace 49 @details The function calls the draw functions for the doodler, floors and bullet. For the floors, a
el17m2h 26:d16a5b1e0ace 50 for loop is used to repeat the process to draw the 6 floors. It also draws the screen rectangle and the score.
el17m2h 26:d16a5b1e0ace 51 */
el17m2h 26:d16a5b1e0ace 52 void draw(N5110 &lcd);
el17m2h 26:d16a5b1e0ace 53
el17m2h 26:d16a5b1e0ace 54 /**
el17m2h 26:d16a5b1e0ace 55 @brief Updates the classes in the game by calling it's update functions
el17m2h 26:d16a5b1e0ace 56 @param Gamepad &pad
el17m2h 27:af14fcd5a520 57 @details Firstly, the function checks the collision of the doodler with the floors by getting their current positions
el17m2h 27:af14fcd5a520 58 and inputing them to the "check_floors_collision" function, which will update the velocity of the doodler. Secondly, it
el17m2h 27:af14fcd5a520 59 calls the "update" functions for the floors and doodler which will update their positions. It then calls the
el17m2h 27:af14fcd5a520 60 "add_score" function to update the score value. Next, it checks if the doodler fire's by inputing the doodler's
el17m2h 27:af14fcd5a520 61 previous position and updated position, as well as the pad's input. Finally, it calls a function to check if the doodler
el17m2h 27:af14fcd5a520 62 has reached the bottom of the screen to end the game.
el17m2h 24:67dc71a8f009 63 */
el17m2h 5:8814d6de77d0 64 void update(Gamepad &pad);
el17m2h 24:67dc71a8f009 65
el17m2h 24:67dc71a8f009 66 /**
el17m2h 26:d16a5b1e0ace 67 @brief Checks a collision and sets the doodler's velocity (if it jumps) direction
el17m2h 26:d16a5b1e0ace 68 @param float doodler_pos_x
el17m2h 26:d16a5b1e0ace 69 @param float doodler_pos_y
el17m2h 26:d16a5b1e0ace 70 @param double doodler_vel_y
el17m2h 26:d16a5b1e0ace 71 @details Checks a collision by comparing the doodler's position with the floors' ones with 3 conditions:
el17m2h 26:d16a5b1e0ace 72 if the doodler is moving downwards (its velocity is positive), if the doodler's x-coordinate is within the
el17m2h 26:d16a5b1e0ace 73 floor's x-coordinate and if the floors' y-coordinate is the same as the doodler's feet (by getting the position
el17m2h 26:d16a5b1e0ace 74 in integers so the difference can be 0 and by adding 15 from the doodler's position (so it gets the feet position).
el17m2h 26:d16a5b1e0ace 75 If the conditions are met, it means there is a collision, which means the doodler's velocity will change direction
el17m2h 26:d16a5b1e0ace 76 (will be set to a negative value). The function also checks the doodler's velocity function to update the velocity
el17m2h 26:d16a5b1e0ace 77 accordingly (make it increase or decrease by multiplying it with constant values) so that the doodler accelerates
el17m2h 26:d16a5b1e0ace 78 or decelerates according to its current velocity.
el17m2h 24:67dc71a8f009 79 */
el17m2h 24:67dc71a8f009 80 void check_floors_collision(float doodler_pos_x, float doodler_pos_y, double doodler_vel_y);
el17m2h 24:67dc71a8f009 81
el17m2h 24:67dc71a8f009 82 /**
el17m2h 26:d16a5b1e0ace 83 @brief Checks if the doodler fires
el17m2h 26:d16a5b1e0ace 84 @param Gamepad &pad
el17m2h 26:d16a5b1e0ace 85 @param float updated_doodler_pos_x
el17m2h 26:d16a5b1e0ace 86 @param float updated_doodler_pos_y
el17m2h 26:d16a5b1e0ace 87 @param float doodler_pos_y
el17m2h 26:d16a5b1e0ace 88 @details The function checks the bullet's position and the input of the user (if the
el17m2h 26:d16a5b1e0ace 89 Y button has been pressed). If the bullet is not currently fired (its position
el17m2h 26:d16a5b1e0ace 90 equals the current doodler's trunk position) and the button Y is pressed, then the bullet is
el17m2h 26:d16a5b1e0ace 91 updated to a new position (upwards) and the pad makes a sound indicating it is shooting. If
el17m2h 26:d16a5b1e0ace 92 it is currently above the doodler's position, it means it has been fired, so continues being
el17m2h 26:d16a5b1e0ace 93 updated. The update function will eventually check if the bullet has reached the end top of the
el17m2h 26:d16a5b1e0ace 94 screen, which will make the bullet return to the doodler's trunk's position. If this is the case
el17m2h 26:d16a5b1e0ace 95 and the button Y has not been pressed, the bullet remains in the doodler's position (by inputing
el17m2h 26:d16a5b1e0ace 96 the doodler's position to the initialize function instead of the update one).
el17m2h 24:67dc71a8f009 97 */
el17m2h 23:9be87557b89a 98 void check_fire(Gamepad &pad, float updated_doodler_pos_x, float updated_doodler_pos_y, float doodler_pos_y);
el17m2h 24:67dc71a8f009 99
el17m2h 24:67dc71a8f009 100 /**
el17m2h 26:d16a5b1e0ace 101 @brief Increases score by checking the position of the floor
el17m2h 26:d16a5b1e0ace 102 @details The function uses a foor loop to check the current position of every floor and
el17m2h 26:d16a5b1e0ace 103 if they have reached the top of the screen (meaning they have re-appeared at the top, the
el17m2h 26:d16a5b1e0ace 104 score will have one point added. This means that the score depends on how many floors re-appear,
el17m2h 26:d16a5b1e0ace 105 which represents how high the doodler has moved upwards.
el17m2h 24:67dc71a8f009 106 */
el17m2h 21:6b16ca9834e6 107 void add_score();
el17m2h 24:67dc71a8f009 108
el17m2h 28:e0161a52a8b9 109 int get_score();
el17m2h 28:e0161a52a8b9 110
el17m2h 27:af14fcd5a520 111 void set_game_over(float doodler_pos_y);
el17m2h 27:af14fcd5a520 112
el17m2h 27:af14fcd5a520 113
el17m2h 27:af14fcd5a520 114 bool get_game_over();
el17m2h 27:af14fcd5a520 115
el17m2h 19:5a7b0cdf013b 116 private:
el17m2h 18:9f40a2f8c2c5 117 Bullet _b;
el17m2h 19:5a7b0cdf013b 118 float _b_pos_x;
el17m2h 19:5a7b0cdf013b 119 float _b_pos_y;
el17m2h 21:6b16ca9834e6 120
el17m2h 21:6b16ca9834e6 121 int _score;
el17m2h 27:af14fcd5a520 122 bool game_ends;
el17m2h 19:5a7b0cdf013b 123
el17m2h 23:9be87557b89a 124 Floors _f[6]; // array of 6 floors
el17m2h 4:8ec314f806ae 125
el17m2h 2:360a6c301a4e 126 int _floors_height;
el17m2h 2:360a6c301a4e 127 int _floors_width;
el17m2h 4:8ec314f806ae 128
el17m2h 2:360a6c301a4e 129 // x and y positions of the floors
el17m2h 23:9be87557b89a 130 Vector2D _f_pos[6]; //
el17m2h 5:8814d6de77d0 131
el17m2h 5:8814d6de77d0 132 Doodler _dood;
el17m2h 24:67dc71a8f009 133 float doodler_pos_x;
el17m2h 24:67dc71a8f009 134 float doodler_pos_y;
el17m2h 24:67dc71a8f009 135 float updated_doodler_pos_x;
el17m2h 24:67dc71a8f009 136 float updated_doodler_pos_y;
el17m2h 24:67dc71a8f009 137 float doodler_vel_x;
el17m2h 24:67dc71a8f009 138 double doodler_vel_y;
el17m2h 23:9be87557b89a 139 float distance_y[6];
el17m2h 17:74de8c17ddac 140
el17m2h 19:5a7b0cdf013b 141 int _screen_pos_x;
el17m2h 19:5a7b0cdf013b 142 int _screen_pos_y;
el17m2h 19:5a7b0cdf013b 143 int _screen_width;
el17m2h 19:5a7b0cdf013b 144 int _screen_height;
el17m2h 19:5a7b0cdf013b 145
el17m2h 5:8814d6de77d0 146 Direction _d;
el17m2h 5:8814d6de77d0 147 float _mag;
el17m2h 16:e0542761fc8c 148 bool _button_A;
el17m2h 16:e0542761fc8c 149 bool _button_B;
el17m2h 16:e0542761fc8c 150 bool _button_X;
el17m2h 16:e0542761fc8c 151 bool _button_Y;
el17m2h 2:360a6c301a4e 152 };
el17m2h 2:360a6c301a4e 153 #endif