Voici une simple fonction vous permettant de tester si une position quelconque (typiquement, la position d'un clic de souris), se situe dans un sf::Sprite. L'intérêt de la fonction et de pouvoir fonctionner quel que soit l'inclinaison du dit Sprite. De plus, elle vous permet de gérer la transparence de votre sprite en indiquant le seuil de transparence (en alpha) à partir du quel un hit peut être détecté. Voici donc la fonction suivie d'un code minimal si vous voulez la tester.
La fonction
bool hitTest (sf::Sprite const & sprite, sf::Vector2f const & point, unsigned short int const alpha = 0) { /*************************************************************/ // Cette méthode test si un clic souris a été fait dans un // sprite, qu'il soit droit ou incliné. // Ce test est effectif pour n'importe quel angle de rotation. // Si la transparence du pixel est sous le seuil fixé, le test // retourne faux. Le seuil valant de 0 à 255. /*************************************************************/ sf::Vector2f pointT = sprite.TransformToLocal(point); if (pointT.x <= 0) return false; else if (pointT.x >= sprite.GetSubRect().GetWidth()) return false; else if (pointT.y <= 0) return false; else if (pointT.y >= sprite.GetSubRect().GetHeight()) return false; return (sprite.GetPixel(pointT.x + sprite.GetSubRect().Left, pointT.y + sprite.GetSubRect().Top)).a >= alpha; }
Le code minimal
int main() { sf::RenderWindow App(sf::VideoMode(800, 600), "HitTest", sf::Style::Close); // Exemple basique avec un sprite sf::Sprite sprite; sprite.Resize(200,100); sprite.SetPosition(300,300); sprite.SetColor(sf::Color(0,255,255,255)); while (App.IsOpened()) { sf::Event Event; while (App.GetEvent(Event)) { if (Event.Type == sf::Event::Closed) App.Close(); if (Event.Type == sf::Event::MouseButtonPressed) // Dans le cas présent, on envoi simplement la position de la souris lors du clic sous forme de sf::Vector2f // ainsi que le sf::Sprite sur lequel nous voulons tester le clic. if (hitTest(sprite, sf::Vector2f(Event.MouseButton.X, Event.MouseButton.Y))) { sprite.Rotate(45); } } App.Clear(); App.Draw(sprite); App.Display(); } return EXIT_SUCCESS; }
Pour toutes questions, n'hésitez pas à aller sur la page du forum associé > Ici <