Biensur que je peux montrer ça , voilà comment j'ai procédé :
J'ai une fonction qui n'est appelée qu'une seule fois et qui me permet de dessiner ma " scène " :
int xCursor = 0;
int yCursor = 0;
bool terminated = false;
int time = 0;
while (terminated == false) {
ConvexShape shape;
shape.setPointCount(4);
shape.setPoint(0, Vector2f(0, 16));
shape.setPoint(1, Vector2f(32, 0));
shape.setPoint(2, Vector2f(63, 16));
shape.setPoint(3, Vector2f(32, 32));
shape.setFillColor(Color::Transparent);
shape.setOutlineThickness(1);
shape.setOutlineColor(Color::White);
shape.setPosition(Vector2f(xCursor, yCursor));
tabConvex.push_back(shape);
arrayCollision.push_back(false);
xCursor += 63;
if (xCursor >= 756) {
int rest = time % 2;
if (rest == 0) {
yCursor += 17;
xCursor = 32;
time++;
}
else if (rest != 0) {
xCursor = 0;
yCursor += 17;
time++;
}
}
if (time == 34) {
terminated = true;
}
}
Puis à chaque tour de boucle j’appelle cette fonction qui me permet de mettre la case que je survole en "surbrillance", la premiere boucle for me permet simplement de remettre à zéro la "surbrillance" :
int mouseX = (int)sf::Mouse::getPosition(p_window).x;
int mouseY = (int)sf::Mouse::getPosition(p_window).y;
for (int i = 0; i < tabConvex.size(); i++) {
tabConvex[i].setFillColor(Color::Transparent);
}
for (int i = 0; i < tabConvex.size(); i++) {
FloatRect boundBox = tabConvex[i].getGlobalBounds();
if (boundBox.contains(mouseX, mouseY)) {
tabConvex[i].setFillColor(Color::Red);
}
}
Ne connaissant pas du tout la SFML il y a encore 3 semaines je me suis posé la question de si ces fameuses bounding box étaient du pixel-perfect collision .. Apparemment vous semblez m'indiquer que non et c'est ce que je craignais.
Je suppose qu'il vaudrait donc mieux reconsidérer les collisions OO ? Qui testerait des vecteurs entre deux points de mes formes et par le calcul de déterminant on essaye de trouver si les coordonnées de la souris sont comprise dans le polygone ?
J'essaye de tous mettre à plat il faut donc, vous me corrigerez si je me trompe :
- Récupérer le bon polygone à tester composé de 4 points ABCD, dans le vector où il est stocké
- Supposons notre souris en M(X ; Y ) quelconque et notre polygone A( xA; yA ) , B(xB; yB ) , C(xC ; yC) et D(xD ; yD)
- On va étudier les vecteur AB , BC , CD et DA par rapport au vecteur AM , BM , CM , DM
Avec comme exemple pour AB ---> T( xB - xA ; yB - yA ) et AM ----> P( X - xA ; Y - yA )
- On a donc nos deux vecteur T et P , on calcul le déterminant des deux : d = (Tx * Py) - (Ty * Px )
en fonction du résultat on aura un résultat r = 0 ou > 0 ou encore < à 0
- Si r > 0 alors notre point sera bien vers l'intérieur du polygone, il ne reste plus qu'a tester la même chose avec les 3 autres vecteurs et si pour les 4 vecteur r > 0 les coordonnées de la souris seront toujours vers l'intéreur du polygone et donc bien à l'intérieur de la "case"
- Une fois tout ça validé on peut donc déclencher la surbrillance de la case
Je vais essayer de coder ça et je le posterais histoire d'avoir vos retours