WIP
* 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:
parent
98b75c48be
commit
5dcca2bb3e
5 changed files with 133 additions and 20 deletions
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Reference in a new issue