Gérer le Picking

Nous utiliserons 3 fonctions déja données dans le Wiki (Distance, Angle et Translate) : Fonctions mathématiques simples

Changement de repère

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());
}

Le test

/*!
* \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;
}

Commentaires

Ces fonctions seraient biensûr de bien meilleures interfaces intégrées en tant que fonction membres des objets concernés.

 
fr/sources/picking.txt · Last modified: 2008/05/17 10:00 by Laurent
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki