/*! * * @file pixelManager.h * @author RUBINI Thomas * @author SIMAILA Djalim * @author FABRE Lucas * @date January 2022 * @version 1.0 * @brief manager * */ #ifndef GUARD_PIXELMANAGER_H #define GUARD_PIXELMANAGER_H #include #include "mingl/mingl.h" #include "mingl/shape/line.h" #include "mingl/shape/triangle.h" #include "mingl/shape/rectangle.h" #include "mingl/shape/circle.h" #include "mingl/gui/sprite.h" #include "mingl/gui/text.h" #include "utils.h" #include "playMode.h" #include "menu.h" using namespace std; #define MIRROR(SP) mirrorData((SP).getPixelData(), (SP).getRowSize()), (SP).getRowSize() typedef nsGui::GlutFont::GlutFonts Font; /*! * @class PixelManager * @brief main display function, clear the window and calls sub display functions */ class PixelManager{ public: MinGL& window; /* * Sprites are not const because for some reason the texture is associated with coordinates, * and we have no way to dissociate them... * So the objects are constantly updated with new coordinates as they need to be drawn * We used {} insead of () for the constructor because the () makes the compiler think we declare methods * * (We could copy them every time, but I feel like copying image data every frame isn't great) */ /*! * @brief sprite of the logo of the game */ nsGui::Sprite logo{"assets/logo.si2"}; /*! * @brief sprite of the background during gameplay */ nsGui::Sprite gameBackground{"assets/game_background.si2"}; /*! * @brief sprite of the background during menu */ nsGui::Sprite menuBackground{"assets/menu_background.si2"}; /*! * @brief sprite of the right hand of god */ nsGui::Sprite rightHand{"assets/hand_open.si2"}; /*! * @brief sprite of the left hand of god */ nsGui::Sprite leftHand{MIRROR(rightHand)}; /*! * @brief constructor the pixel manager class * @param[in] window : window of the pixel manager * @fn PixelManager(MinGL&); */ explicit PixelManager(MinGL& window); /*! * @brief display a type A invader on screen * @param[in] baseVector : pixel coordinate of the invader * @param[in] size : size multiplicator of the invader * @param[in] color : color multiplicaror of the invader * @fn void drawInvaderA(const Position& baseVector, unsigned size, const RGBAcolor& color) const; */ void drawInvaderA(const Position& baseVector, unsigned size, const RGBAcolor& color) const; /*! * @brief display a type B invader on screen * @param[in] baseVector : pixel coordinate of the invader * @param[in] size : size multiplicator of the invader * @param[in] color : color multiplicaror of the invader * @fn void drawInvaderB(const Position& baseVector, unsigned size, const RGBAcolor& color) const; */ void drawInvaderB(const Position& baseVector, unsigned size, const RGBAcolor& color) const; /*! * @brief display a type C invader on screen * @param[in] baseVector : pixel coordinate of the invader * @param[in] size : size multiplicator of the invader * @param[in] color : color multiplicaror of the invader * @fn void drawInvaderC(const Position& baseVector, unsigned size, const RGBAcolor& color) const; */ void drawInvaderC(const Position& baseVector, unsigned size, const RGBAcolor& color) const; /*! * @brief display a player on screen * @param[in] x : horizontal position of the player * @param[in] witdh : width of the player * @param[in] color : color of the plater * @fn void drawPlayer(unsigned x, unsigned width, const nsGraphics::RGBAcolor& color) const; */ void drawPlayer(unsigned x, unsigned width, const nsGraphics::RGBAcolor& color) const; /*! * @brief display a missile on screen * @param[in] baseVector : pixel coordinates of the missile * @param[in] width : width of the missle * @param[in] color : color of the missile * @fn void drawMissile(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color) const; */ void drawMissile(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color) const; /*! * @brief display a torpedo on screen * @param[in] baseVector : pixel coordinates of the torpedo * @param[in] width : width of the torpedo * @param[in] color : color of the torpedo * @fn void drawTorpedo(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color) const; */ void drawTorpedo(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color) const; #define HEART_LENGTH 40 /*! * @brief display a singular heart on screen * @param[in] baseVector : pixel coordinates of the heart * @fn void drawHeart(const Position& baseVector) const; */ void drawHeart(const Position& baseVector) const; /*! * @brief display a sprite on screen * @param[in] sprite : sprite to draw * @param[in] pos : pixel coordinates to draw the sprite * @fn void drawSprite(const nsGui::Sprite& sprite, const Position& pos = Position(0, 0)) const; */ void drawSprite(const nsGui::Sprite& sprite, const Position& pos = Position(0, 0)) const; /*! * @brief display a menu button on screen * @param[in] baseVector : pixel coordinates of the button * @param[in] text : text inside the button * @param[in] color : color of the text inside the button * @fn void displayButton(const Position& baseVector,const string& text,nsGraphics::RGBAcolor& color); */ void displayButton(const Position& baseVector,const string& text,nsGraphics::RGBAcolor& color); /*! * @brief display a menu on screen * @param[in] pos : pixel coordinates of the menu * @param[in,out] currentMenu : menu struct conteining the menu option * @fn void displayMenu(const Position& pos, Menu& currentMenu); */ void displayMenu(const Position& pos, Menu& currentMenu); /*! * @brief display text on screen * @param[in] pos : pixel coordinates of the text * @param[in] text : text to show on screen * @param[in] color : color of the text to show * @fn void drawText(const Position& pos, const string& text, const nsGraphics::RGBAcolor& color = nsGraphics::KWhite) const; */ void drawText(const Position& pos, const string& text, const RGBAcolor& color = nsGraphics::KWhite, Font font = Font::BITMAP_TIMES_ROMAN_24) const; /*! * @brief show the title screen of the game * @return the playmode chosen inside the menu * @fn PlayMode showInitialMenu(); */ PlayMode showInitialMenu(); /*! * @brief show the menu after a player lose, or all invader has been defeated * @return true if the player plays again, else false * @fn bool showDeathMenu(); */ bool showDeathMenu(); /*! * @brief give the height of the screen * @return the height of the screen in pixel * @fn unsigned getScreenHeight() const; */ unsigned getScreenHeight() const; /*! * @brief give the width of the screen * @return the width of the screen in pixel * @fn unsigned getScreenWidth() const; */ unsigned getScreenWidth() const; /*! * @brief clear the screen for a new frame * @fn void startFrame() const; */ void startFrame() const; /*! * @brief finish a frame render * @fn void endFrame() const; */ void endFrame() const; /*! * @brief display the player name selection menu * @param[in] pID : player id * @param[in] score : score of this player * @param[out] name : name selected by the player * @fn */ void askPlayerNameMenu(playerID pID, unsigned score, string& name); // y will be negative sometimes, so not unsigned /*! * @brief display god's bar * @param[in] y : god y pixel position * @fn void drawGodBench(int y) const */ void drawGodBench(int y) const; /*! * @brief display god's right hand * @param[in] pos : pixel coordiniates of the hand * @fn void drawGodRightHand(const Position& pos) const; */ void drawGodRightHand(const Position& pos) const; /*! * @brief display god's left hand * @param[in] pos : pixel coordiniates of the hand * @fn void drawGodLeftHand(const Position& pos) const; */ void drawGodLeftHand(const Position& pos) const; /*! * @brief display god's face * @param[in] y : god's face y pixel position * @param[in] angry : flag if god is angry or not * @fn void drawGodFace(int y, bool angry=false) const; */ void drawGodFace(int y, bool angry=false) const; private: // Explanation for choices : // non reference output : I don't think we have another choice than a std::move() here /*! * @brief * @param[in] inPixel : vector of pixel from a sprite * @param[in] rowSize : size of a line of pixel * @fn vector mirrorData(const vector& inPixels, unsigned rowSize); */ static vector mirrorData(const vector& inPixels, unsigned rowSize); }; #endif