* ajout de positions supplémentaires pour les barrières
* ajout d'un placeholder visuel pour aider a placer une barriere
This commit is contained in:
Mylloon 2024-01-07 14:14:11 +01:00
parent 98b75c48be
commit 5dcca2bb3e
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
5 changed files with 133 additions and 20 deletions

View file

@ -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;
};

View file

@ -4,12 +4,10 @@
#include "PieceSafari.hpp"
class PlateauSafari : public Plateau {
// Barrières
std::vector<PieceSafari *> 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);
};

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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) {