Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SFML] Fonction booléenne pour les sprites

Des que je touche UN DES PIXELS

    18 décembre 2007 à 20:39:08

    Salut à tous !!

    Etant de nature un gros flemmard, je cherche à savoir s'il existe une fonction en SFML permettant de savoir des que je touche un bout du sprite ( car les coordonnées de ce dernier correspondent à son centre ).

    Je sais que je peux faire moi meme cette fonction mais si elle existe, c'est pas de refus :p

    Merci d'avance et bonne soirée !!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      18 décembre 2007 à 20:54:49

      Citation : freemp

      car les coordonnées de ce dernier correspondent à son centre.


      J'ai pas compris, tu dis que GetTop et GetLeft te donne le centre du sprite? C'est faux.

      Pour voir si un point est contenu dans la surface occupée d'un sprite :
      http://sfml.sourceforge.net/documentation/classsf_1_1Sprite.htm#725156b958e3f01342da8a9e7dfe842f
      http://sfml.sourceforge.net/documentation/classsf_1_1Rect.htm#6f3adf98e6b230825f139a30923afa30

      Un petit exemple :
      1. sf::Sprite s;
      2. if (s.GetSubRect().Contains(10, 10))
      3.     std::cout << "le point (10;10) appartient à s." << std::endl;


      EDIT : Mais attention! Ceci ne gère pas la transparence, donc si c'est pour un système de collision ce n'est pas le top du top...
      • Partager sur Facebook
      • Partager sur Twitter
        18 décembre 2007 à 21:02:37

        Merci de ta réponsé !

        Non, je voulais savoir si il existait une fonction booléenne permettant de retourner True si 2 sprite se touchent et False si ce n'est pas le cas.

        Sinon, tu viens de me faire penser, j'utilise la transparence avec des images gifs mais si je veux faire un systeme de collision, quelles fonctions permettent avec cette librairie de:

        1. Rendre transparente une couleur de mon image.

        2. Renvoyer true ou false si deux sprites se touchent.

        Merci d'avance
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          18 décembre 2007 à 21:28:23

          Il faut bien explorer la doc. ;)http://sfml.sourceforge.net/documentation/classes.htm
          D'abord, les sprites : la fonction bool sf::Rect< T >::Intersects devrait t'aider.
          Petit exemple :
          1. sf::Sprite s1(...), s2(...); /// Construction de deux sprites.
          2. if (s1.GetSubRect().Intersects(s2.GetSubRect()))
          3.     std::cout << "Collision" << std::endl;


          Ensuite, donner à une couleur la transparence : la fonction sf::Image::CreateMaskFromColor va t'être utile.
          Exemple :
          1. sf::Image i(...); /// Création d'une image.
          2. /// On change tout les rouges "pures" en "invisible".
          3. i.CreateMaskFromColor(sf::Color(255, 0, 0));



          Morale de l'histoire :
          La doc est la clef à beaucoup de maux.

          Voilà. ;)
          • Partager sur Facebook
          • Partager sur Twitter
            19 décembre 2007 à 2:32:40

            Prendre simplement le SubRect ne fonctionnera pas, car les coordonnées de celui-ci sont relatives à l'image source, elles ne prennent donc pas en compte la position / rotation / échelle du sprite. Par contre il est très facile de le faire manuellement, hormis pour la rotation qui sera un peu plus ardûe.

            Sans la rotation :
            1. sf::FloatRect GetSpriteRect(const sf::Sprite& S)
            2. {
            3.     return sf::FloatRect(S.GetLeft(),
            4.                           S.GetTop(),
            5.                           S.GetLeft() + S.GetWidth(),
            6.                           S.GetTop()  + S.GetHeight());
            7. }


            Je me demande d'ailleurs si je ne devrais pas ajouter ce genre de fonctions à la classe Sprite directemen.
            • Partager sur Facebook
            • Partager sur Twitter
              19 décembre 2007 à 12:03:54

              Citation : hiura

              Il faut bien explorer la doc. ;)http://sfml.sourceforge.net/documentation/classes.htm
              D'abord, les sprites : la fonction bool sf::Rect< T >::Intersects devrait t'aider.
              Petit exemple :

              1. sf::Sprite s1(...), s2(...); /// Construction de deux sprites.
              2. if (s1.GetSubRect().Intersects(s2.GetSubRect()))
              3.     std::cout << "Collision" << std::endl;

              Oui mais non, la transparence n'est pas comprise là-dedans.
              A toi de coder un test de pixel perfect.

              Pour la rotation je ne sais pas si il y a une classe pour dans la SFML. Peut-être sur le svn.
              • Partager sur Facebook
              • Partager sur Twitter

              [SFML] Fonction booléenne pour les sprites

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown