invaders now pew pew too (and did some refactoring)

This commit is contained in:
Thomas 2022-01-02 00:10:57 +01:00
parent bffc3bf04c
commit 306d557030
No known key found for this signature in database
GPG Key ID: E538821A6CDFDAD7
20 changed files with 181 additions and 143 deletions

View File

@ -9,7 +9,7 @@ typedef string configKey;
struct ConfigData {
invadersGrid grid;
InvadersGrid grid;
unsigned startXPosition;
unsigned playersSpeed;

View File

@ -18,8 +18,8 @@ private:
PixelManager pm;
ConfigData confData;
position basePos;
invadersGrid grid;
Position basePos;
InvadersGrid grid;
bool direction = true;
vector<missile> missiles;
@ -28,11 +28,18 @@ private:
PlayMode playMode;
vector<Player> players;
void managePlayers();
bool manageInvaders();
// invaders related variables
unsigned fireCooldown=120;
// basic methods
void display();
// collision thingies
// managers
void managePlayers();
void manageOnePlayer(unsigned);
bool manageInvaders();
// collision things
void remCollidingProjectiles();
void moveMissiles();
void moveTorpedos();
@ -40,8 +47,6 @@ private:
bool checkTorpedosAndInvaders();
bool invadersTouchPlayer();
void manageOnePlayer(unsigned);
public:
// in case someone wants to mess with the code, here's a minimal API, costs nothing to us
Game();

View File

@ -1,7 +1,7 @@
#ifndef GUARD_PLAYMODE_H
#define GUARD_PLAYMODE_H
enum PlayMode {
enum class PlayMode {
NONE,
SINGLE,
TWO_LOCAL,

View File

@ -3,9 +3,9 @@
#include "utils.h"
typedef position missile;
typedef Position missile;
class torpedo : public position {
class torpedo : public Position {
public:
playerID owner;
torpedo(int x, int y, playerID owner);

View File

@ -8,7 +8,7 @@
#define PLAYER_HEIGHT 100
#define PROJ_LENGTH_FACTOR 2
enum WinValue{
enum class WinValue{
NOBODY, // should never be used
PLAYERS,
INVADERS,
@ -16,13 +16,17 @@ enum WinValue{
using namespace std;
typedef unsigned Invader;
typedef vector<Invader> invadersColumn;
typedef vector<invadersColumn> invadersGrid;
typedef nsGraphics::Vec2D position;
enum class Invader {
TypeA,
TypeB,
TypeC,
};
typedef vector<Invader> InvadersColumn;
typedef vector<InvadersColumn> InvadersGrid;
typedef nsGraphics::Vec2D Position;
typedef unsigned playerID;
// didn't want to use position because of the semantic with x and y
// didn't want to use Position because of the semantic with x and y
bool areLinesColliding(unsigned start1, unsigned end1, unsigned start2, unsigned end2);
#endif

View File

@ -37,7 +37,7 @@ public:
/**
* @brief Constructeur de recopie pour la classe Vec2D
* @param[in] pos : Vec2D a copier
* @fn Vec2D(const Vec2D& position);
* @fn Vec2D(const Vec2D& Position);
*/
Vec2D(const Vec2D& pos);
@ -56,21 +56,21 @@ public:
/**
* @brief Opérateur d'addition
* @param[in] pos : Vecteur a additionner
* @fn Vec2D operator+(const Vec2D& position) const;
* @fn Vec2D operator+(const Vec2D& Position) const;
*/
Vec2D operator+(const Vec2D& pos) const;
/**
* @brief Opérateur de soustraction
* @param[in] pos : Vecteur a soustraire
* @fn Vec2D operator-(const Vec2D& position) const;
* @fn Vec2D operator-(const Vec2D& Position) const;
*/
Vec2D operator-(const Vec2D& pos) const;
/**
* @brief Opérateur de multiplication
* @param[in] pos : Vecteur a multiplier
* @fn Vec2D operator*(const Vec2D& position) const;
* @fn Vec2D operator*(const Vec2D& Position) const;
*/
Vec2D operator*(const Vec2D& pos) const;
@ -84,7 +84,7 @@ public:
/**
* @brief Opérateur de division
* @param[in] pos : Vecteur a diviser
* @fn Vec2D operator/(const Vec2D& position) const;
* @fn Vec2D operator/(const Vec2D& Position) const;
*/
Vec2D operator/(const Vec2D& pos) const;
@ -98,21 +98,21 @@ public:
/**
* @brief Opérateur modulo
* @param[in] pos : Vecteur avec lequel faire un modulo
* @fn Vec2D operator%(const Vec2D& position) const;
* @fn Vec2D operator%(const Vec2D& Position) const;
*/
Vec2D operator%(const Vec2D& pos) const;
/**
* @brief Opérateur d'égalité
* @param[in] pos : Vecteur avec lequel vérifier l'égalité
* @fn bool operator==(const Vec2D& position) const;
* @fn bool operator==(const Vec2D& Position) const;
*/
bool operator==(const Vec2D& pos) const;
/**
* @brief Opérateur d'inégalité
* @param[in] pos : Vecteur avec lequel vérifier l'inégalité
* @fn bool operator!=(const Vec2D& position) const;
* @fn bool operator!=(const Vec2D& Position) const;
*/
bool operator!=(const Vec2D& pos) const;
@ -120,7 +120,7 @@ public:
* @brief Opérateur de stricte infériorité
* (Vérifie la stricte infériorité de la magnitude des deux vecteurs)
* @param[in] pos : Vecteur avec lequel vérifier la stricte infériorité
* @fn bool operator<(const Vec2D& position) const;
* @fn bool operator<(const Vec2D& Position) const;
*/
bool operator<(const Vec2D& pos) const;
@ -128,7 +128,7 @@ public:
* @brief Opérateur de stricte supériorité
* (Vérifie la stricte supériorité de la magnitude des deux vecteurs)
* @param[in] pos : Vecteur avec lequel vérifier la stricte supériorité
* @fn bool operator>(const Vec2D& position) const;
* @fn bool operator>(const Vec2D& Position) const;
*/
bool operator>(const Vec2D& pos) const;
@ -136,7 +136,7 @@ public:
* @brief Opérateur d'infériorité
* (Vérifie l'infériorité de la magnitude des deux vecteurs)
* @param[in] pos : Vecteur avec lequel vérifier l'infériorité
* @fn bool operator<=(const Vec2D& position) const;
* @fn bool operator<=(const Vec2D& Position) const;
*/
bool operator<=(const Vec2D& pos) const;
@ -144,49 +144,49 @@ public:
* @brief Opérateur de supériorité
* (Vérifie la supériorité de la magnitude des deux vecteurs)
* @param[in] pos : Vecteur avec lequel vérifier la supériorité
* @fn bool operator>=(const Vec2D& position) const;
* @fn bool operator>=(const Vec2D& Position) const;
*/
bool operator>=(const Vec2D& pos) const;
/**
* @brief Opérateur d'assignement
* @param[in] pos : Vecteur source
* @fn Vec2D& operator=(const Vec2D& position);
* @fn Vec2D& operator=(const Vec2D& Position);
*/
Vec2D& operator=(const Vec2D& pos);
/**
* @brief Opérateur d'addition avec assignement
* @param[in] pos : Vecteur avec lequel additionner le vecteur actuel
* @fn Vec2D& operator+=(const Vec2D& position);
* @fn Vec2D& operator+=(const Vec2D& Position);
*/
Vec2D& operator+=(const Vec2D& pos);
/**
* @brief Opérateur de soustraction avec assignement
* @param[in] pos : Vecteur avec lequel soustraire le vecteur actuel
* @fn Vec2D& operator-=(const Vec2D& position);
* @fn Vec2D& operator-=(const Vec2D& Position);
*/
Vec2D& operator-=(const Vec2D& pos);
/**
* @brief Opérateur de multiplication avec assignement
* @param[in] pos : Vecteur avec lequel multiplier le vecteur actuel
* @fn Vec2D& operator*=(const Vec2D& position);
* @fn Vec2D& operator*=(const Vec2D& Position);
*/
Vec2D& operator*=(const Vec2D& pos);
/**
* @brief Opérateur de division avec assignement
* @param[in] pos : Vecteur avec lequel diviser le vecteur actuel
* @fn Vec2D& operator/=(const Vec2D& position);
* @fn Vec2D& operator/=(const Vec2D& Position);
*/
Vec2D& operator/=(const Vec2D& pos);
/**
* @brief Opérateur modulo avec assignement
* @param[in] pos : Vecteur avec lequel faire un modulo sur le vecteur actuel
* @fn Vec2D& operator%=(const Vec2D& position);
* @fn Vec2D& operator%=(const Vec2D& Position);
*/
Vec2D& operator%=(const Vec2D& pos);
@ -222,29 +222,29 @@ public:
double computeMagnitude() const;
/**
* @brief Récupère la position X (abscisse)
* @brief Récupère la Position X (abscisse)
* @return Une référence constante vers m_x
* @fn int getX() const;
*/
int getX() const;
/**
* @brief Définit la nouvelle position X (abscisse)
* @param[in] x : Nouvelle position X
* @brief Définit la nouvelle Position X (abscisse)
* @param[in] x : Nouvelle Position X
* @fn void setX(int x);
*/
void setX(int x);
/**
* @brief Récupère la position Y (ordonnée)
* @brief Récupère la Position Y (ordonnée)
* @return Une référence constante vers m_y
* @fn int getY() const;
*/
int getY() const;
/**
* @brief Définit la nouvelle position Y (ordonnée)
* @param[in] y : Nouvelle position Y
* @brief Définit la nouvelle Position Y (ordonnée)
* @param[in] y : Nouvelle Position Y
* @fn void setY(int y);
*/
void setY(int y);

View File

@ -32,14 +32,14 @@ public:
* @brief TransitionIds : Liste de toutes les transitions que cet élément peut exécuter
*/
enum TransitionIds {
TRANSITION_POSITION, /**< Transition pour la position */
TRANSITION_POSITION, /**< Transition pour la Position */
};
/**
* @brief Constructeur pour la classe Sprite, charge les données depuis un fichier
* @param[in] filename : Chemin d'accès vers le fichier image
* @param[in] position : Position du sprite
* @fn Sprite(const std::string& filename, const nsGraphics::Vec2D& position = nsGraphics::Vec2D());
* @fn Sprite(const std::string& filename, const nsGraphics::Vec2D& Position = nsGraphics::Vec2D());
*/
Sprite(const std::string& filename, const nsGraphics::Vec2D& position = nsGraphics::Vec2D());
@ -48,7 +48,7 @@ public:
* @param[in] pixelData : Vecteur contenant des données sur les pixels
* @param[in] rowSize : Nombre de pixels par ligne
* @param[in] position : Position du sprite
* @fn Sprite(const std::vector<nsGraphics::RGBAcolor>& pixelData, const uint32_t& rowSize, const nsGraphics::Vec2D& position = nsGraphics::Vec2D());
* @fn Sprite(const std::vector<nsGraphics::RGBAcolor>& pixelData, const uint32_t& rowSize, const nsGraphics::Vec2D& Position = nsGraphics::Vec2D());
*/
Sprite(const std::vector<nsGraphics::RGBAcolor>& pixelData, const uint32_t& rowSize, const nsGraphics::Vec2D& position = nsGraphics::Vec2D());
@ -72,16 +72,16 @@ public:
const std::vector<nsGraphics::RGBAcolor>& getPixelData() const;
/**
* @brief Récupère la position du sprite
* @brief Récupère la Position du sprite
* @return Une référence const vers m_position
* @fn const nsGraphics::Vec2D& getPosition() const;
*/
const nsGraphics::Vec2D& getPosition() const;
/**
* @brief Définit la nouvelle position du sprite
* @param[in] position : Nouvelle position
* @fn void setPosition(const nsGraphics::Vec2D &position);
* @brief Définit la nouvelle Position du sprite
* @param[in] position : Nouvelle Position
* @fn void setPosition(const nsGraphics::Vec2D &Position);
*/
void setPosition(const nsGraphics::Vec2D& position);

View File

@ -36,7 +36,7 @@ public:
enum TransitionIds {
TRANSITION_COLOR_RGB, /**< Transition pour la couleur RGB */
TRANSITION_COLOR_ALPHA, /**< Transition pour la transparence */
TRANSITION_POSITION, /**< Transition pour la position */
TRANSITION_POSITION, /**< Transition pour la Position */
};
/**
@ -65,7 +65,7 @@ public:
* @param[in] textFont : Police du texte (8x13 Bitmap par défaut)
* @param[in] horizontalAlignment : Alignement horizontal du texte (Alignement a gauche par défaut)
* @param[in] verticalAlignment : Alignement vertical du texte (Alignement en bas par défaut)
* @fn Text(const nsGraphics::Vec2D &position, const std::string &content,
* @fn Text(const nsGraphics::Vec2D &Position, const std::string &content,
const nsGraphics::RGBAcolor &textColor, const GlutFont::GlutFonts &textFont = GlutFont::GlutFonts::BITMAP_8_BY_13,
const HorizontalAlignment &horizontalAlignment = ALIGNH_LEFT,
const VerticalAlignment &verticalAlignment = ALIGNV_BOTTOM);
@ -95,15 +95,15 @@ public:
int computeHeight() const;
/**
* @brief Calcule la position visible du texte, calculée avec l'alignement vertical et horizontal
* @return La position visible, en haut a gauche
* @brief Calcule la Position visible du texte, calculée avec l'alignement vertical et horizontal
* @return La Position visible, en haut a gauche
* @fn nsGraphics::Vec2D computeVisiblePosition() const;
*/
nsGraphics::Vec2D computeVisiblePosition() const;
/**
* @brief Calcule la position de fin visible du texte, calculée avec l'alignement vertical et horizontal
* @return La position visible, en bas a droite
* @brief Calcule la Position de fin visible du texte, calculée avec l'alignement vertical et horizontal
* @return La Position visible, en bas a droite
* @fn nsGraphics::Vec2D computeVisibleEndPosition() const;
*/
nsGraphics::Vec2D computeVisibleEndPosition() const;
@ -123,15 +123,15 @@ public:
void setContent(const std::string &content);
/**
* @brief Récupère la position du texte
* @brief Récupère la Position du texte
* @fn const nsGraphics::Vec2D& getPosition() const;
*/
const nsGraphics::Vec2D& getPosition() const;
/**
* @brief Définit la nouvelle position du texte
* @param[in] position : Nouvelle position
* @fn void setPosition(const nsGraphics::Vec2D &position);
* @brief Définit la nouvelle Position du texte
* @param[in] position : Nouvelle Position
* @fn void setPosition(const nsGraphics::Vec2D &Position);
*/
void setPosition(const nsGraphics::Vec2D &position);

View File

@ -154,14 +154,14 @@ public:
void setWindowSize(const nsGraphics::Vec2D& windowSize);
/**
* @brief Récupère la position de la fenêtre
* @brief Récupère la Position de la fenêtre
* @fn nsGraphics::Vec2D getWindowPosition() const;
*/
nsGraphics::Vec2D getWindowPosition() const;
/**
* @brief Règle la position de la fenêtre
* @param[in] windowPosition : Nouvelle position
* @brief Règle la Position de la fenêtre
* @param[in] windowPosition : Nouvelle Position
* @fn void setWindowPosition(const nsGraphics::Vec2D &windowPosition);
*/
void setWindowPosition(const nsGraphics::Vec2D &windowPosition);

View File

@ -34,7 +34,7 @@ public:
TRANSITION_FILL_COLOR_ALPHA, /**< Transition pour la transparence de remplissage */
TRANSITION_BORDER_COLOR_RGB, /**< Transition pour la couleur de bord */
TRANSITION_BORDER_COLOR_ALPHA, /**< Transition pour la transparence de bord */
TRANSITION_POSITION, /**< Transition pour la position */
TRANSITION_POSITION, /**< Transition pour la Position */
TRANSITION_RADIUS, /**< Transition pour le rayon */
};
@ -44,7 +44,7 @@ public:
* @param[in] radius : Rayon du cercle
* @param[in] fillColor : Couleur de remplissage
* @param[in] borderColor : Couleur de bord
* @fn Circle(const nsGraphics::Vec2D& position, const unsigned& radius, const nsGraphics::RGBAcolor& fillColor, const nsGraphics::RGBAcolor& borderColor = nsGraphics::KTransparent);
* @fn Circle(const nsGraphics::Vec2D& Position, const unsigned& radius, const nsGraphics::RGBAcolor& fillColor, const nsGraphics::RGBAcolor& borderColor = nsGraphics::KTransparent);
*/
Circle(const nsGraphics::Vec2D& position, const unsigned& radius, const nsGraphics::RGBAcolor& fillColor, const nsGraphics::RGBAcolor& borderColor = nsGraphics::KTransparent);
@ -62,27 +62,27 @@ public:
/**
* @brief Opérateur de décalage
* @param[in] position : Position a additionner
* @fn Circle operator+(const nsGraphics::Vec2D& position) const
* @fn Circle operator+(const nsGraphics::Vec2D& Position) const
*/
Circle operator+(const nsGraphics::Vec2D& getPosition) const;
/**
* @brief Opérateur de réduction
* @param[in] f : Nombre avec lequel multiplier la position actuelle
* @param[in] f : Nombre avec lequel multiplier la Position actuelle
* @fn Circle operator*(const float& f) const
*/
Circle operator*(const float& f) const;
/**
* @brief Récupère la position du cercle
* @brief Récupère la Position du cercle
* @fn const nsGraphics::Vec2D& getPosition() const;
*/
const nsGraphics::Vec2D& getPosition() const;
/**
* @brief Définit la nouvelle position du cercle
* @param[in] position : Nouvelle position
* @fn void setPosition(const nsGraphics::Vec2D &position);
* @brief Définit la nouvelle Position du cercle
* @param[in] position : Nouvelle Position
* @fn void setPosition(const nsGraphics::Vec2D &Position);
*/
void setPosition(const nsGraphics::Vec2D &position);

View File

@ -34,8 +34,8 @@ public:
TRANSITION_FILL_COLOR_ALPHA, /**< Transition pour la transparence de remplissage */
TRANSITION_BORDER_COLOR_RGB, /**< Transition pour la couleur de bord */
TRANSITION_BORDER_COLOR_ALPHA, /**< Transition pour la transparence de bord */
TRANSITION_FIRST_POSITION, /**< Transition pour la position du premier sommet */
TRANSITION_SECOND_POSITION, /**< Transition pour la position du second sommet */
TRANSITION_FIRST_POSITION, /**< Transition pour la Position du premier sommet */
TRANSITION_SECOND_POSITION, /**< Transition pour la Position du second sommet */
TRANSITION_LINE_WIDTH, /**< Transition pour l'épaisseur de la ligne */
};
@ -63,39 +63,39 @@ public:
/**
* @brief Opérateur de décalage
* @param[in] position : Position a additionner
* @fn Line operator+(const nsGraphics::Vec2D& position) const
* @fn Line operator+(const nsGraphics::Vec2D& Position) const
*/
Line operator+(const nsGraphics::Vec2D& position) const;
/**
* @brief Opérateur de réduction
* @param[in] f : Nombre avec lequel multiplier la position actuelle
* @param[in] f : Nombre avec lequel multiplier la Position actuelle
* @fn Line operator*(const float& f) const
*/
Line operator*(const float& f) const;
/**
* @brief Récupère la position du premier sommet de la ligne
* @brief Récupère la Position du premier sommet de la ligne
* @fn const nsGraphics::Vec2D& getFirstPosition() const;
*/
const nsGraphics::Vec2D& getFirstPosition() const;
/**
* @brief Définit la nouvelle position du premier sommet de la ligne
* @param[in] firstPosition : Nouvelle position du premier sommet
* @brief Définit la nouvelle Position du premier sommet de la ligne
* @param[in] firstPosition : Nouvelle Position du premier sommet
* @fn void setFirstPosition(const nsGraphics::Vec2D &firstPosition);
*/
void setFirstPosition(const nsGraphics::Vec2D &firstPosition);
/**
* @brief Récupère la position du second sommet de la ligne
* @brief Récupère la Position du second sommet de la ligne
* @fn const nsGraphics::Vec2D& getSecondPosition() const;
*/
const nsGraphics::Vec2D& getSecondPosition() const;
/**
* @brief Définit la nouvelle position du second sommet de la ligne
* @param[in] secondPosition : Nouvelle position du second sommet
* @brief Définit la nouvelle Position du second sommet de la ligne
* @param[in] secondPosition : Nouvelle Position du second sommet
* @fn void setSecondPosition(const nsGraphics::Vec2D &secondPosition);
*/
void setSecondPosition(const nsGraphics::Vec2D &secondPosition);

View File

@ -34,8 +34,8 @@ public:
TRANSITION_FILL_COLOR_ALPHA, /**< Transition pour la transparence de remplissage */
TRANSITION_BORDER_COLOR_RGB, /**< Transition pour la couleur de bord */
TRANSITION_BORDER_COLOR_ALPHA, /**< Transition pour la transparence de bord */
TRANSITION_FIRST_POSITION, /**< Transition pour la position du coin haut-gauche */
TRANSITION_SECOND_POSITION, /**< Transition pour la position du coin bas-droit */
TRANSITION_FIRST_POSITION, /**< Transition pour la Position du coin haut-gauche */
TRANSITION_SECOND_POSITION, /**< Transition pour la Position du coin bas-droit */
};
/**
@ -57,7 +57,7 @@ public:
* @param[in] height : Hauteur du rectangle
* @param[in] fillColor : Couleur de remplissage
* @param[in] borderColor : Couleur de bord
* @fn Rectangle(const nsGraphics::Vec2D& position, const unsigned& width, const unsigned& height, const nsGraphics::RGBAcolor& fillColor,
* @fn Rectangle(const nsGraphics::Vec2D& Position, const unsigned& width, const unsigned& height, const nsGraphics::RGBAcolor& fillColor,
const nsGraphics::RGBAcolor& borderColor = nsGraphics::KTransparent);
*/
Rectangle(const nsGraphics::Vec2D& position, const unsigned& width, const unsigned& height, const nsGraphics::RGBAcolor& fillColor,
@ -77,39 +77,39 @@ public:
/**
* @brief Opérateur de décalage
* @param[in] position : Position a additionner
* @fn Rectangle operator+(const nsGraphics::Vec2D& position) const
* @fn Rectangle operator+(const nsGraphics::Vec2D& Position) const
*/
Rectangle operator+(const nsGraphics::Vec2D& position) const;
/**
* @brief Opérateur de réduction
* @param[in] f : Nombre avec lequel multiplier la position actuelle
* @param[in] f : Nombre avec lequel multiplier la Position actuelle
* @fn Rectangle operator*(const float& f) const
*/
Rectangle operator*(const float& f) const;
/**
* @brief Récupère la position du coin haut-gauche du rectangle
* @brief Récupère la Position du coin haut-gauche du rectangle
* @fn const nsGraphics::Vec2D& getFirstPosition() const;
*/
const nsGraphics::Vec2D& getFirstPosition() const;
/**
* @brief Définit la nouvelle position du coin haut-gauche du rectangle
* @param[in] firstPosition : Nouvelle position du coin haut-gauche
* @brief Définit la nouvelle Position du coin haut-gauche du rectangle
* @param[in] firstPosition : Nouvelle Position du coin haut-gauche
* @fn void setFirstPosition(const nsGraphics::Vec2D &firstPosition);
*/
void setFirstPosition(const nsGraphics::Vec2D &firstPosition);
/**
* @brief Récupère la position du coin bas-droit du rectangle
* @brief Récupère la Position du coin bas-droit du rectangle
* @fn const nsGraphics::Vec2D& getSecondPosition() const;
*/
const nsGraphics::Vec2D& getSecondPosition() const;
/**
* @brief Définit la nouvelle position du coin bas-droit du rectangle
* @param[in] secondPosition : Nouvelle position du coin bas-droit
* @brief Définit la nouvelle Position du coin bas-droit du rectangle
* @param[in] secondPosition : Nouvelle Position du coin bas-droit
* @fn void setSecondPosition(const nsGraphics::Vec2D &secondPosition);
*/
void setSecondPosition(const nsGraphics::Vec2D &secondPosition);

View File

@ -34,9 +34,9 @@ public:
TRANSITION_FILL_COLOR_ALPHA, /**< Transition pour la transparence de remplissage */
TRANSITION_BORDER_COLOR_RGB, /**< Transition pour la couleur de bord */
TRANSITION_BORDER_COLOR_ALPHA, /**< Transition pour la transparence de bord */
TRANSITION_FIRST_POSITION, /**< Transition pour la position du premier sommet */
TRANSITION_SECOND_POSITION, /**< Transition pour la position du second sommet */
TRANSITION_THIRD_POSITION, /**< Transition pour la position du troisième sommet */
TRANSITION_FIRST_POSITION, /**< Transition pour la Position du premier sommet */
TRANSITION_SECOND_POSITION, /**< Transition pour la Position du second sommet */
TRANSITION_THIRD_POSITION, /**< Transition pour la Position du troisième sommet */
};
/**
@ -66,52 +66,52 @@ public:
/**
* @brief Opérateur de décalage
* @param[in] position : Position a additionner
* @fn Triangle operator+(const nsGraphics::Vec2D& position) const
* @fn Triangle operator+(const nsGraphics::Vec2D& Position) const
*/
Triangle operator+(const nsGraphics::Vec2D& position) const;
/**
* @brief Opérateur de réduction
* @param[in] f : Nombre avec lequel multiplier la position actuelle
* @param[in] f : Nombre avec lequel multiplier la Position actuelle
* @fn Triangle operator*(const float& f) const
*/
Triangle operator*(const float& f) const;
/**
* @brief Récupère la position du premier sommet du triangle
* @brief Récupère la Position du premier sommet du triangle
* @fn const nsGraphics::Vec2D& getFirstPosition() const;
*/
const nsGraphics::Vec2D& getFirstPosition() const;
/**
* @brief Définit la nouvelle position du premier sommet du triangle
* @param[in] firstPosition : Nouvelle position du premier sommet
* @brief Définit la nouvelle Position du premier sommet du triangle
* @param[in] firstPosition : Nouvelle Position du premier sommet
* @fn void setFirstPosition(const nsGraphics::Vec2D &firstPosition);
*/
void setFirstPosition(const nsGraphics::Vec2D &firstPosition);
/**
* @brief Récupère la position du second sommet du triangle
* @brief Récupère la Position du second sommet du triangle
* @fn const nsGraphics::Vec2D& getSecondPosition() const;
*/
const nsGraphics::Vec2D& getSecondPosition() const;
/**
* @brief Définit la nouvelle position du second sommet du triangle
* @param[in] secondPosition : Nouvelle position du second sommet
* @brief Définit la nouvelle Position du second sommet du triangle
* @param[in] secondPosition : Nouvelle Position du second sommet
* @fn void setSecondPosition(const nsGraphics::Vec2D &secondPosition);
*/
void setSecondPosition(const nsGraphics::Vec2D &secondPosition);
/**
* @brief Récupère la position du troisième sommet du triangle
* @brief Récupère la Position du troisième sommet du triangle
* @fn const nsGraphics::Vec2D& getThirdPosition() const;
*/
const nsGraphics::Vec2D& getThirdPosition() const;
/**
* @brief Définit la nouvelle position du troisième sommet du triangle
* @param[in] thirdPosition : Nouvelle position du troisième sommet
* @brief Définit la nouvelle Position du troisième sommet du triangle
* @param[in] thirdPosition : Nouvelle Position du troisième sommet
* @fn void setThirdPosition(const nsGraphics::Vec2D &thirdPosition);
*/
void setThirdPosition(const nsGraphics::Vec2D &thirdPosition);

View File

@ -70,7 +70,7 @@ void ConfigBuilder::readConfig() {
collectedData.grid.resize(S);
for(unsigned i=0;i<S;++i){
collectedData.grid[i].resize(3);
for(unsigned j=0;j<3;++j)collectedData.grid[i][j] = j;
for(unsigned j=0;j<3;++j)collectedData.grid[i][j] = static_cast<Invader>(j);
}
// players

View File

@ -14,17 +14,17 @@ Game::Game() : WININIT, pm(window) {
void Game::managedGames() {
playMode = NONE;
playMode = PlayMode::NONE;
while(playMode!=EXIT){
if(playMode==NONE){
while(playMode!=PlayMode::EXIT){
if(playMode==PlayMode::NONE){
playMode = initialMenuHandler();
}else{
playGame(); // will read the playMode
cout << players[0].score << endl; // will remove
cout << "END OF GAME" << endl;
break; // TODO remove
if(!deathMenuHandler()) playMode = NONE; // back to the main menu
if(!deathMenuHandler()) playMode = PlayMode::NONE; // back to the main menu
}
}
@ -58,15 +58,6 @@ bool Game::deathMenuHandler(){
return pm.showDeathMenu();
}
bool Game::invadersTouchPlayer(){
for(invadersColumn& line : grid){
if(basePos.getY()+ line.size() * confData.invadersSize >= pm.getScreenHeight() - PLAYER_HEIGHT){
return true;
}
}
return false;
}
/**
* Plays the game, and returns once the game is finished
*
@ -78,21 +69,21 @@ WinValue Game::playGame(){ // returns when game is finished
grid = confData.grid; // will copy the vector
if(playMode==SINGLE){
if(playMode==PlayMode::SINGLE){
players.resize(1);
}else{
players.resize(2);
// mirror the start X position for the other
// mirror the start X Position for the other
players[1].x = pm.getScreenWidth() - confData.startXPosition - confData.playersWidth;
}
players[0].x = confData.startXPosition;
basePos = position(0,0);
basePos = Position(0, 0);
// GAMELOOP
#define FPS 1000
#define MAX_FPS 1000
while(window.isOpen()){
auto targetTime = chrono::high_resolution_clock::now() + chrono::duration<double, ratio<1, FPS>>(1);
auto targetTime = chrono::high_resolution_clock::now() + chrono::duration<double, ratio<1, MAX_FPS>>(1);
pm.startFrame();
@ -104,8 +95,8 @@ WinValue Game::playGame(){ // returns when game is finished
moveTorpedos();
remCollidingProjectiles();
if(checkMissilesAndPlayers())return INVADERS;
if(checkTorpedosAndInvaders())return PLAYERS;
if(checkMissilesAndPlayers())return WinValue::INVADERS;
if(checkTorpedosAndInvaders())return WinValue::PLAYERS;
display();
@ -128,15 +119,15 @@ void Game::display() {
basePos.getY() + j * confData.invadersSize + j * confData.invadersDistance
);
switch(grid[i][j]){
case 0:{
case Invader::TypeA:{
pm.drawInvader1(vec, confData.invadersSize);
break;
}
case 1:{
case Invader::TypeB:{
pm.drawInvader2(vec, confData.invadersSize);
break;
}
case 2:{
case Invader::TypeC:{
pm.drawInvader3(vec, confData.invadersSize);
break;
}
@ -145,13 +136,13 @@ void Game::display() {
}
for(missile& miss : missiles){
pm.drawTorpedo(miss, confData.missilesWidth, confData.missilesColor);
pm.drawMissile(miss, confData.missilesWidth, confData.missilesColor);
}
for(torpedo& tor : torpedos){
pm.drawTorpedo(tor, confData.torpedosWidth, confData.torpedosColor);
}
for(size_t i=0;i<players.size();++i){
pm.drawPlayer(position(players[i].x, 0), confData.playersWidth, confData.playerDefs[i].color);
pm.drawPlayer(Position(players[i].x, 0), confData.playersWidth, confData.playerDefs[i].color);
}
}

View File

@ -1,7 +1,7 @@
#include "game.h"
void Game::manageOnePlayer(unsigned id){
#define ISPRESSED(ID, X) window.isPressed({confData.playerDefs[ID].keys.X, false})
void Game::manageOnePlayer(unsigned id){
if (ISPRESSED(id, left)){
if(players[id].x < confData.playersSpeed) players[id].x = 0;
else players[id].x -= confData.playersSpeed;
@ -33,8 +33,36 @@ void Game::managePlayers(){
* @return true if the invaders went down from one line (and we should check lower boundary), else false
*/
bool Game::manageInvaders(){
// shoot
if(fireCooldown==0){
cout << "try" << endl;
fireCooldown = confData.invadersFireCooldown+rand()%60;
// compute the number of valid columns for firing, so rand() can't pick an empty column to fire
unsigned counter=0;
for(InvadersColumn& col : grid){
if(!col.empty())++counter;
}
unsigned rd = (rand()%counter)+1;
counter = 0;
for(size_t i=0;i<grid.size();++i){
if(!grid[i].empty())++counter;
if(counter==rd){
// fire !
missiles.push_back(basePos+Position(
confData.invadersSize*i+confData.invadersDistance*(i+0.5),
confData.invadersSize*(grid[i].size()-1)+confData.invadersDistance*(grid[i].size()-1)
));
break;
}
}
}else --fireCooldown;
// moving
if(direction){ // go to the right
int end = basePos.getX(); // start position
int end = basePos.getX(); // start Position
end+= grid.size() * confData.invadersSize; // add the invaders
end+= (grid.size()-1) * confData.invadersDistance; // add the invadersDistance between invaders
@ -87,7 +115,7 @@ void Game::remCollidingProjectiles(){
}
++tor;
}
/* if it was colling, it was removed and his position is now replaced by the next.
/* if it was colling, it was removed and his Position is now replaced by the next.
* else, go to the next
*/
if(!wasColliding)++miss;
@ -119,9 +147,9 @@ void Game::moveTorpedos() {
bool Game::checkMissilesAndPlayers() {
auto miss_ite = missiles.begin();
while(miss_ite!=missiles.end()){
bool wasColliding = false;
if(miss_ite->getY()<=PLAYER_HEIGHT){ // check collision on Y
// now check collision on X (with both players)
bool wasColliding = false;
for(Player& p : players){
if(areLinesColliding(
miss_ite->getX(), miss_ite->getX() + confData.missilesWidth,
@ -131,9 +159,9 @@ bool Game::checkMissilesAndPlayers() {
// do not break, the second player also deserves to be hit
}
}
if(wasColliding)missiles.erase(miss_ite);
else ++miss_ite;
}
if(wasColliding)missiles.erase(miss_ite);
else ++miss_ite;
}
return false; // TODO manage death animation
}
@ -143,8 +171,8 @@ bool Game::checkTorpedosAndInvaders() {
while(tor_ite!=torpedos.end()){
unsigned i=0;
for(;i<grid.size();++i){
// calculate top-left position of invader
position pos = basePos+position(
// calculate top-left Position of invader
Position pos = basePos + Position(
confData.invadersSize*i+confData.invadersDistance*i,
confData.invadersSize*(grid[i].size()-1)+confData.invadersDistance*(grid[i].size()-1)
);
@ -167,4 +195,13 @@ bool Game::checkTorpedosAndInvaders() {
}
}
return false;
}
}
bool Game::invadersTouchPlayer(){
for(InvadersColumn& line : grid){
if(basePos.getY() + line.size() * confData.invadersSize >= pm.getScreenHeight() - PLAYER_HEIGHT){
return true;
}
}
return false;
}

View File

@ -4,6 +4,7 @@ using namespace std;
// TODO changer tout les unsigned par des size_t dans les boucles
int main(){
srand(time(NULL));
Game g;
g.managedGames();

View File

@ -45,11 +45,11 @@ void PixelManager::drawPlayer(const nsGraphics::Vec2D& baseVector, unsigned widt
}
void PixelManager::drawMissile(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){
window << nsShape::Rectangle(baseVector, baseVector+position(width, width*PROJ_LENGTH_FACTOR), color);
window << nsShape::Rectangle(baseVector, baseVector + Position(width, width * PROJ_LENGTH_FACTOR), color);
}
void PixelManager::drawTorpedo(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){
window << nsShape::Rectangle(baseVector, baseVector+position(width, width*PROJ_LENGTH_FACTOR), color);
window << nsShape::Rectangle(baseVector, baseVector + Position(width, width * PROJ_LENGTH_FACTOR), color);
}
void PixelManager::drawBackground(){

View File

@ -1,5 +1,5 @@
#include "projectiles.h"
torpedo::torpedo(int x, int y, playerID owner) : position(x, y) {
torpedo::torpedo(int x, int y, playerID owner) : Position(x, y) {
this->owner = owner;
}

View File

@ -3,4 +3,4 @@
bool areLinesColliding(unsigned start1, unsigned end1, unsigned start2, unsigned end2){
return start1 < end2 == start2 < end1;
// if it returns true, lines are colliding. I like truth tables
}
}