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;
|
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();
|
virtual ~PieceSafari();
|
||||||
|
|
||||||
// Couleur sur l'écran
|
// Couleur sur l'écran
|
||||||
|
@ -24,6 +25,12 @@ struct PieceSafari : public Piece {
|
||||||
// Nom de la pièce
|
// Nom de la pièce
|
||||||
std::string getName() const;
|
std::string getName() const;
|
||||||
|
|
||||||
|
// Renvoie la position 2 unique aux barrières
|
||||||
|
Position getPos2() const;
|
||||||
|
|
||||||
private:
|
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;
|
const std::string to_string(const enum Categorie) const;
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,12 +4,10 @@
|
||||||
#include "PieceSafari.hpp"
|
#include "PieceSafari.hpp"
|
||||||
|
|
||||||
class PlateauSafari : public Plateau {
|
class PlateauSafari : public Plateau {
|
||||||
|
|
||||||
// Barrières
|
// Barrières
|
||||||
std::vector<PieceSafari *> barrieres;
|
std::vector<PieceSafari *> barrieres;
|
||||||
|
|
||||||
PositionMutable placementBarriere1;
|
PositionMutable placeholderBarriere;
|
||||||
PositionMutable placementBarriere2;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PlateauSafari();
|
PlateauSafari();
|
||||||
|
@ -20,4 +18,17 @@ public:
|
||||||
|
|
||||||
// Vérifie que le déplacement est valide
|
// Vérifie que le déplacement est valide
|
||||||
bool deplacementValide(const int destX, const int destY) const;
|
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"
|
#include "../../includes/Safari/PieceSafari.hpp"
|
||||||
|
|
||||||
PieceSafari::PieceSafari(const enum Categorie cat, const int posX,
|
PieceSafari::PieceSafari(const enum Categorie cat, const int posX,
|
||||||
const int posY)
|
const int posY, const int pos2X, const int pos2Y)
|
||||||
: Piece(to_string(cat), posX, posY), _category(cat) {}
|
: Piece(to_string(cat), posX, posY), _category(cat),
|
||||||
|
pos2(std::make_pair(pos2X, pos2Y)) {}
|
||||||
|
|
||||||
PieceSafari::~PieceSafari() {}
|
PieceSafari::~PieceSafari() {}
|
||||||
|
|
||||||
|
@ -34,3 +35,11 @@ enum PieceSafari::Categorie PieceSafari::getCategory() const {
|
||||||
std::string PieceSafari::getName() const {
|
std::string PieceSafari::getName() const {
|
||||||
return categorie;
|
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"
|
#include "../../includes/Ecran.hpp"
|
||||||
|
|
||||||
PlateauSafari::PlateauSafari()
|
PlateauSafari::PlateauSafari()
|
||||||
: Plateau(8), placementBarriere1(emptyPosition()),
|
: Plateau(8), placeholderBarriere(emptyPosition()) {
|
||||||
placementBarriere2(emptyPosition()) {
|
|
||||||
// Au début, le plateau est vide
|
// Au début, le plateau est vide
|
||||||
|
|
||||||
// Les joueurs vont choisir leur animal, on place autant d'animal différent
|
// 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.);
|
elephant.setOutlineThickness(2.);
|
||||||
sf::CircleShape lion(tailleCellule / 3);
|
sf::CircleShape lion(tailleCellule / 3);
|
||||||
lion.setOutlineThickness(2.);
|
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;
|
const float decalagePiece = tailleCellule / 6;
|
||||||
|
|
||||||
|
@ -106,12 +112,38 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dessine les mur
|
// Dessine les mur
|
||||||
/* for (auto it : barrieres) {
|
for (PieceSafari *it : barrieres) {
|
||||||
// TODO
|
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
|
// 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) {
|
if (d) {
|
||||||
out << "---\n";
|
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 {
|
bool PlateauSafari::deplacementValide(const int x, const int y) const {
|
||||||
|
if (!selection) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Position posInitiale = selection->getPos();
|
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 ||
|
return std::abs(x - posInitiale.first) == 0 ||
|
||||||
std::abs(y - posInitiale.second) == 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: {
|
case EnJeu: {
|
||||||
const Piece *p = getPiece(posCurseur.first, posCurseur.second);
|
const Piece *p = getPiece(posCurseur.first, posCurseur.second);
|
||||||
bool justChanged = false;
|
|
||||||
|
|
||||||
// Déplacer un animal
|
// Déplacer un animal
|
||||||
if (!deplacerAnimal && p == nullptr) {
|
if (!deplacerAnimal && p == nullptr) {
|
||||||
// Vérifier que le déplacement est correct
|
// Vérifier que le déplacement est correct
|
||||||
if (plateau.deplacementValide(posCurseur.first, posCurseur.second)) {
|
if (plateau.deplacementValide(posCurseur.first, posCurseur.second)) {
|
||||||
plateau.moveSelection(posCurseur.first, posCurseur.second);
|
plateau.moveSelection(posCurseur.first, posCurseur.second);
|
||||||
justChanged = true;
|
|
||||||
deplacerAnimal = true;
|
deplacerAnimal = true;
|
||||||
Ecran::printMessage(msgTonTour());
|
Ecran::printMessage(msgTonTour());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Poser une barrière
|
// Poser une barrière
|
||||||
if (!placerBarriere && !justChanged) {
|
if (deplacerAnimal && !placerBarriere) {
|
||||||
// TODO
|
PositionMutable placeholder = plateau.getPlaceholderBarriere();
|
||||||
// J'ai comme idée de cliquer sur 2 cases et de placer la barrière entre
|
if (placeholder.first == -1) {
|
||||||
// les 2 cases choisies
|
// On place le placeholder
|
||||||
// Prendre en compte qu'il faut rajouter un marqueur quand on clique sur
|
plateau.setPlaceholderBarriere(posCurseur.first, posCurseur.second);
|
||||||
// une case vide
|
} 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) {
|
if (p != nullptr) {
|
||||||
|
|
Reference in a new issue