Nous utiliserons 3 fonctions déja données dans le Wiki (Distance, Angle et Translate) : Fonctions mathématiques simples
Cette fonction place le point a tester dans le repère propre a l'objet, ce qui s'avérera fort utile ensuite pour le test de picking.
/*! * \brief Changement de repère * \param Item : Place le point dans le repère de cet objet * \param p : Point a passer dans le nouveau repère * \return Point dans le repère de 'Item' */ inline sf::Vector2f DansLeRepereDe(const sf::Drawable& Item, const sf::Vector2f& p) { float distance = Distance(p, Item.GetPosition()); float angle = Angle(p, Item.GetPosition()); return Translate(distance, angle - Item.GetRotation()); }
/*! * \brief Test de picking sur un Sprite * \param s : Sprite a tester * \param p : Point du click * \param AlphaMax : seuil de transparence : -1 par défaut (PixelPerfect désactivé) * \return true si cliqué, false sinon */ inline bool IsPicked(const sf::Sprite& s, const sf::Vector2f& p, const int AlphaMax = -1) { sf::Vector2f pt = DansLeRepereDe(s, p) - s.GetCenter(); if ( pt.x > 0 && pt.x < s.GetSize().x && pt.y > 0 && pt.y < s.GetSize().y ) { if (AlphaMax >= 0) { if (s.GetPixel(static_cast<int>(pt.x), static_cast<int>(pt.y)).a <= AlphaMax) return false; } return true; } return false; } /*! * \brief Test de picking sur une String * \param s : String a tester * \param p : Point du click * \return true si cliqué, false sinon */ inline bool IsPicked(const sf::String& s, const sf::Vector2f& p) { sf::Vector2f pt = DansLeRepereDe(s, p) - s.GetCenter(); if ( pt.x > 0 && pt.x < s.GetRect().GetWidth() && pt.y > 0 && pt.y < s.GetRect().GetHeight() ) return true; return false; }
Ces fonctions seraient biensûr de bien meilleures interfaces intégrées en tant que fonction membres des objets concernés.