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

Auteur Sujet: Probleme d'état d'un bool dans une boucle avec un contains  (Lu 2179 fois)

0 Membres et 1 Invité sur ce sujet

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Probleme d'état d'un bool dans une boucle avec un contains
« le: Février 19, 2013, 09:43:59 pm »
Bonsoir,

Me voici avec un petit problème que je pige pas, pour résumer j'ai un vector de sf:FloatRect et la position de la souris en temps réel.
J'ai fais une boucle pour savoir si la souris est en collision avec chaque box.

Dans la boucle j'ai mis des sf::text etc ... et tout fonctionne bien.

Mais j'ai voulu rajouté un bool pour m'afficher si ça touche ou pas (je vais m'en servir plus loin dans le programme de ce bool)
Le problème il se met à true seulement au dernier élément du vector, quand je passe la souris sur les premiers sprites, le bool reste à 0 et quand je la passe sur le dernier ça passe bien à 1.

Je ne comprend pas ce qu'il se passe même si je pense que c'est tout bête ...
J'ai mis les 2 lignes de commentaires à propos de ce bool

void Gui::collision_souris_sprite_entite(sf::RenderTarget &target, std::vector<sf::FloatRect> &box_entite, sf::View &vue, std::vector<Entite> &total_entite, bool clic_gauche)
{
    for(unsigned int i = 0; i < total_entite.size(); i ++)
    {
        if(box_entite[i].contains(pos_souris_vue))
        {
            touche_entite = true; // <-----Ici je met bien à true si je touche
            infos[0].setString(total_entite[i].recup_pseudo());
            infos[0].setCharacterSize(20);
            infos[0].setPosition(vue.getCenter().x + 400, vue.getCenter().y);
            infos[1].setString(total_entite[i].recup_vie());
            infos[1].setCharacterSize(20);
            infos[1].setPosition(vue.getCenter().x + 400, vue.getCenter().y + 50);
            for(unsigned char j = 0; j < 2; j++)
            target.draw(infos[j]);

            //Si clic gauche sur la cible, on récupère les infos
            if(clic_gauche)
            {
                cible = new sf::Text();
                pseudo_cible = total_entite[i].recup_pseudo();
                cible->setString(pseudo_cible);
                entite_cible_actuel = total_entite[i];
            }
        }
        else
        touche_entite = false; // <---- Ici je remet à false si je touche pas
    }
}
 

merci d'avance

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme d'état d'un bool dans une boucle avec un contains
« Réponse #1 le: Février 19, 2013, 10:24:10 pm »
En effet c'est vraiment bête, et il suffit de faire tourner un exemple qui ne marche pas dans sa tête pour s'en rendre compte. Exemple : la première boîte contient le point, pas la seconde.

Test de la première boîte : touche_entite passe à true
Test de la second boîte : touche_entite repasse à false
Résultat final : touche_entite vaut false

Conclusion : tu ne dois renvoyer false que si aucune boîte ne collisionne. Or là finalement ce que tu fais reviens uniquement à tester la toute dernière, le résultat des autres est ignoré.
Laurent Gomila - SFML developer

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : Probleme d'état d'un bool dans une boucle avec un contains
« Réponse #2 le: Février 20, 2013, 09:15:00 am »
merci pour ton explication c'était vraiment tout bête  :)