From 5dcca2bb3ebf04187a6fc6962f56174e3b747a48 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Sun, 7 Jan 2024 14:14:11 +0100 Subject: [PATCH] =?UTF-8?q?WIP=20*=20ajout=20de=20positions=20suppl=C3=A9m?= =?UTF-8?q?entaires=20pour=20les=20barri=C3=A8res=20*=20ajout=20d'un=20pla?= =?UTF-8?q?ceholder=20visuel=20pour=20aider=20a=20placer=20une=20barriere?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/Safari/PieceSafari.hpp | 9 +++- includes/Safari/PlateauSafari.hpp | 17 +++++-- src/Safari/PieceSafari.cpp | 13 ++++- src/Safari/PlateauSafari.cpp | 85 ++++++++++++++++++++++++++++--- src/Safari/Safari.cpp | 29 ++++++++--- 5 files changed, 133 insertions(+), 20 deletions(-) diff --git a/includes/Safari/PieceSafari.hpp b/includes/Safari/PieceSafari.hpp index 52078f5..22ef988 100644 --- a/includes/Safari/PieceSafari.hpp +++ b/includes/Safari/PieceSafari.hpp @@ -12,7 +12,8 @@ struct PieceSafari : public Piece { const enum Categorie _category; - PieceSafari(const enum Categorie, const int x, const int y); + PieceSafari(const enum Categorie, const int x, const int y, + const int pos2X = -1, const int pos2Y = -1); virtual ~PieceSafari(); // Couleur sur l'écran @@ -24,6 +25,12 @@ struct PieceSafari : public Piece { // Nom de la pièce std::string getName() const; + // Renvoie la position 2 unique aux barrières + Position getPos2() const; + private: + // Seconde position, utilisée par les barrières, qui se placent entre 2 pièces + Position pos2; + const std::string to_string(const enum Categorie) const; }; diff --git a/includes/Safari/PlateauSafari.hpp b/includes/Safari/PlateauSafari.hpp index 253317d..458d023 100644 --- a/includes/Safari/PlateauSafari.hpp +++ b/includes/Safari/PlateauSafari.hpp @@ -4,12 +4,10 @@ #include "PieceSafari.hpp" class PlateauSafari : public Plateau { - // Barrières std::vector barrieres; - PositionMutable placementBarriere1; - PositionMutable placementBarriere2; + PositionMutable placeholderBarriere; public: PlateauSafari(); @@ -20,4 +18,17 @@ public: // Vérifie que le déplacement est valide bool deplacementValide(const int destX, const int destY) const; + + // Renvoie la position du placeholder + Position getPlaceholderBarriere(); + + // Modifie la position du placeholder + void setPlaceholderBarriere(const int x, const int y); + + // Avec les positions du placeholder et les positions données + // Vérifie que les 2 points sont à côtés + bool validWithPlaceholder(const int x, const int y); + + // Place la barrière, renvoie si on a réussi + bool placementBarriere(const int x, const int y); }; diff --git a/src/Safari/PieceSafari.cpp b/src/Safari/PieceSafari.cpp index 4019ea9..a5c04f9 100644 --- a/src/Safari/PieceSafari.cpp +++ b/src/Safari/PieceSafari.cpp @@ -1,8 +1,9 @@ #include "../../includes/Safari/PieceSafari.hpp" PieceSafari::PieceSafari(const enum Categorie cat, const int posX, - const int posY) - : Piece(to_string(cat), posX, posY), _category(cat) {} + const int posY, const int pos2X, const int pos2Y) + : Piece(to_string(cat), posX, posY), _category(cat), + pos2(std::make_pair(pos2X, pos2Y)) {} PieceSafari::~PieceSafari() {} @@ -34,3 +35,11 @@ enum PieceSafari::Categorie PieceSafari::getCategory() const { std::string PieceSafari::getName() const { return categorie; } + +Position PieceSafari::getPos2() const { + if (_category != Barriere) { + throw std::logic_error("Cette pièce n'a pas de seconde position."); + } + + return pos2; +} diff --git a/src/Safari/PlateauSafari.cpp b/src/Safari/PlateauSafari.cpp index cca3a8c..7ddac53 100644 --- a/src/Safari/PlateauSafari.cpp +++ b/src/Safari/PlateauSafari.cpp @@ -2,8 +2,7 @@ #include "../../includes/Ecran.hpp" PlateauSafari::PlateauSafari() - : Plateau(8), placementBarriere1(emptyPosition()), - placementBarriere2(emptyPosition()) { + : Plateau(8), placeholderBarriere(emptyPosition()) { // Au début, le plateau est vide // Les joueurs vont choisir leur animal, on place autant d'animal différent @@ -33,6 +32,13 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const { elephant.setOutlineThickness(2.); sf::CircleShape lion(tailleCellule / 3); lion.setOutlineThickness(2.); + sf::RectangleShape barriereH(sf::Vector2f(tailleCellule / 6, tailleCellule)); + barriereH.setFillColor(sf::Color::Black); + sf::RectangleShape barriereV(sf::Vector2f(tailleCellule, tailleCellule / 6)); + barriereV.setFillColor(sf::Color::Black); + + sf::CircleShape placeholder(tailleCellule / 5); + placeholder.setFillColor(sf::Color::Magenta); const float decalagePiece = tailleCellule / 6; @@ -106,12 +112,38 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const { } // Dessine les mur - /* for (auto it : barrieres) { - // TODO - } */ + for (PieceSafari *it : barrieres) { + Position pos1 = it->getPos(); + Position pos2 = it->getPos2(); + + float x, y; + const int decalage = 10; + + // Verticale + if (pos1.first == pos2.first) { + x = pos1.first; + y = std::max(pos1.second, pos2.second) - decalage; + barriereV.setPosition(x * tailleCellule, y * tailleCellule); + Ecran::window.draw(barriereV); + } + + // Horizontale + else { + x = std::max(pos1.first, pos2.first) - decalage; + y = pos1.second; + barriereH.setPosition(x * tailleCellule, y * tailleCellule); + Ecran::window.draw(barriereH); + } + } // Dessinne les indications pour le placement des murs - // TODO + if (placeholderBarriere.first != -1) { + const int decalagePlaceholder = decalagePiece + 10; + placeholder.setPosition( + placeholderBarriere.first * tailleCellule + decalagePlaceholder, + placeholderBarriere.second * tailleCellule + decalagePlaceholder); + Ecran::window.draw(placeholder); + } if (d) { out << "---\n"; @@ -119,8 +151,49 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const { } bool PlateauSafari::deplacementValide(const int x, const int y) const { + if (!selection) { + return false; + } + Position posInitiale = selection->getPos(); + // TODO: Vérifier qu'il n'y a pas de barrière sur le chemin + return std::abs(x - posInitiale.first) == 0 || std::abs(y - posInitiale.second) == 0; } + +Position PlateauSafari::getPlaceholderBarriere() { + return placeholderBarriere; +} + +void PlateauSafari::setPlaceholderBarriere(const int x, const int y) { + placeholderBarriere = std::make_pair(x, y); +} + +bool PlateauSafari::validWithPlaceholder(const int x, const int y) { + const int diffX = std::abs(placeholderBarriere.first - x); + const int diffY = std::abs(placeholderBarriere.second - y); + + // Vérification adjacence + return (diffX == 1 && diffY == 0) || (diffX == 0 && diffY == 1); +} + +bool PlateauSafari::placementBarriere(const int x, const int y) { + // Vérifie qu'il n'y a pas déjà une pièce ici + for (PieceSafari *it : barrieres) { + Position pos1 = it->getPos(); + Position pos2 = it->getPos2(); + if ((x == pos1.first && y == pos1.second) || + (x == pos2.first && y == pos2.second)) { + // Le point existe déjà + return false; + } + } + + barrieres.push_back(new PieceSafari(PieceSafari::Barriere, + placeholderBarriere.first, + placeholderBarriere.second, x, y)); + + return true; +} diff --git a/src/Safari/Safari.cpp b/src/Safari/Safari.cpp index f39676a..a14dbb1 100644 --- a/src/Safari/Safari.cpp +++ b/src/Safari/Safari.cpp @@ -181,26 +181,39 @@ void Safari::event(const int x, const int y) { case EnJeu: { const Piece *p = getPiece(posCurseur.first, posCurseur.second); - bool justChanged = false; // Déplacer un animal if (!deplacerAnimal && p == nullptr) { // Vérifier que le déplacement est correct if (plateau.deplacementValide(posCurseur.first, posCurseur.second)) { plateau.moveSelection(posCurseur.first, posCurseur.second); - justChanged = true; deplacerAnimal = true; Ecran::printMessage(msgTonTour()); } + + break; } // Poser une barrière - if (!placerBarriere && !justChanged) { - // TODO - // J'ai comme idée de cliquer sur 2 cases et de placer la barrière entre - // les 2 cases choisies - // Prendre en compte qu'il faut rajouter un marqueur quand on clique sur - // une case vide + if (deplacerAnimal && !placerBarriere) { + PositionMutable placeholder = plateau.getPlaceholderBarriere(); + if (placeholder.first == -1) { + // On place le placeholder + plateau.setPlaceholderBarriere(posCurseur.first, posCurseur.second); + } else { + // On vérifie que le second point est bien positionné + // Et on place la barrière si possible + bool valid; + if (plateau.validWithPlaceholder(posCurseur.first, posCurseur.second) && + (valid = plateau.placementBarriere(posCurseur.first, + posCurseur.second))) { + plateau.setPlaceholderBarriere(-1, -1); + placerBarriere = true; + } else { + // On déplace le placeholder + plateau.setPlaceholderBarriere(posCurseur.first, posCurseur.second); + } + } } if (p != nullptr) {