Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: pb template  (Lu 762 fois)

0 Membres et 1 Invité sur ce sujet

Kakarosto

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
pb template
« le: Juillet 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 ?

G.

  • Hero Member
  • *****
  • Messages: 1590
    • Voir le profil
Re: pb template
« Réponse #1 le: Juillet 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 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 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() puis vérifier avec contains si ce rectangle contient ton curseur de souris

Kakarosto

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re: pb template
« Réponse #2 le: Juillet 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;
}

carnecklace

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re: pb template
« Réponse #3 le: Mai 15, 2023, 04:27:14 am »
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;
}

Bonjour
Très détaillé, il a vraiment bien fonctionné.