SFML community forums

Aide => Général => Topic started by: Kakarosto on July 15, 2022, 09:57:43 pm

Title: pb template
Post by: Kakarosto on July 15, 2022, 09:57:43 pm
Bonjour, j'utilise une fonction template qui permet à l'utilisateur d'intéragir avec des sf::RectangleShape ou sf::Sprite avec la souris :

template<typename TShape>
bool MouseInteract(const sf::Event& _event, const sf::RenderWindow& _window, const TShape& _tShape)
{
        bool bReturn = false;

        int mx = sf::Mouse::getPosition(_window).x;
        int my = sf::Mouse::getPosition(_window).y;

        sf::Vector2u sizeShape;

        if (std::is_same<TShape, sf::RectangleShape>::_tShape)
        {
                sizeShape = _tShape.getSize();
        }
        else if (std::is_same<TShape, sf::Sprite>::_tShape)
        {
                sizeShape = _tShape.getTexture()->getSize();
        }

        if (mx > _tShape.getPosition().x && mx < _tShape.getPosition().x + sizeShape.x && // en X
                my > _tShape.getPosition().y && my < _tShape.getPosition().y + sizeShape.y)
        {
                if (_event.type == sf::Event::MouseButtonPressed)
                {
                        if (_event.key.code == sf::Mouse::Left)
                        {
                                bReturn = true;
                        }
                }
        }

        return bReturn;
}

mais il y a un pb à la compilation, donc comment faire ?
Title: Re: pb template
Post by: G. on July 16, 2022, 12:59:15 pm
WTF pourquoi le texte d'erreur est sous forme d'image ?  ???

La première erreur est assez parlante, getSize n'existe pas pour sf::Sprite, comme on peut le constater dans la doc (https://www.sfml-dev.org/documentation/2.5.1/classsf_1_1Sprite.php) donc à _tShape.getSize() le compilateur ne sait pas quoi faire.
Tu peux éventuellement utiliser la fonction getGlobalBounds pour récup les hauteur et largeur de ton sprite. (s'il est pas rotaté)

Ensuite on voit que l'erreur est relative à ton ::_TShape dans le is_same, si on sait pas trop on mate la doc du is_same (https://en.cppreference.com/w/cpp/types/is_same) et on voit que c'est ::value qu'il faut utiliser (ou direct is_same_v si c'est possible)

Pour finir, juste une suggestion pas forcément correcte suivant ce que tu veux faire, si tu veux juste vérifier si le clic de souris est sur un rectangle ou un sprite tu peux récupérer le rectangle englobant de ton sprite ou de ton rectangle avec getGlobalBounds() (https://www.sfml-dev.org/documentation/2.5.1-fr/classsf_1_1Sprite.php#aa795483096b90745b2e799532963e271) puis vérifier avec contains (https://www.sfml-dev.org/documentation/2.5.1-fr/classsf_1_1Rect.php#a910b998c92756157e1407e1363f93212) si ce rectangle contient ton curseur de souris
Title: Re: pb template
Post by: Kakarosto on July 16, 2022, 02:09:53 pm
désolé pour l'erreur en image et merci pour l'aide, ca fonctionne :

template<typename TShape>
bool MouseInteract(const sf::Event& _event, const sf::RenderWindow& _window, const TShape& _tShape)
{
        bool bReturn = false;

        sf::Vector2f posMouse = sf::Vector2f(sf::Mouse::getPosition(_window));

        if (_tShape.getGlobalBounds().contains(posMouse))
        {
                if (_event.type == sf::Event::MouseButtonPressed)
                {
                        if (_event.key.code == sf::Mouse::Left)
                        {
                                bReturn = true;
                        }
                }
        }

        return bReturn;
}