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

Auteur Sujet: Problème de collision entre deux CircleShape  (Lu 2211 fois)

0 Membres et 2 Invités sur ce sujet

clavos

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Problème de collision entre deux CircleShape
« le: Février 22, 2014, 04:29:56 pm »
Bonjour !  :)
Je suis encore un débutant en SFML, et j'essaye donc de me familiariser avec en essayant diverse chose.

Dans une fenêtre j'ai crée deux CircleShape ( un vert que je peux déplacer par des évé,ements que j'ai fait, et un rouge qui lui est immobile ). Mon but était de déplacer ce point vert et de l'emmener vers le point rouge. A ce moment, lors de la collision entre les deux point, je ne suis plus censé pouvoir déplacer le point vert dans la direction du point rouge ( il est bloqué par le point rouge ).

Cependant ca ne marche pas, et mon point vert peux traverser mon point rouge :(

Voici la création de mes deux CircleShape :
CircleShape cercle2(70);//Création du point rouge immobile
        cercle2.setFillColor(Color::Red);
        cercle2.setPosition(330,130); // On place le point rouge au centre de ma fenêtre
        FloatRect box2 = cercle2.getGlobalBounds();//On récupère le cadre autour de la forme

        CircleShape cercle1(50);// Création du point vert déplacable
        cercle1.setFillColor(Color::Green);
        FloatRect box1 = cercle1.getGlobalBounds();//On récupère le cadre autour de la forme
 
Le cercle vert a pour coordonnées (d,e) :)

Et voici par exemple l'événement que j'utilise pour déplacer mon point vert à droite :
                if (sf::Keyboard::isKeyPressed(Keyboard::Right))//Déplacement vers la droite
                {
                        if (d<700 && !(box1.intersects(box2))) {        d=d+1;}// Test si on peux déplacer
                        cercle1.setPosition(d, e);
                        window.clear();
                        window.draw(cercle1);
                }
Je précise que le " d<700 " est un test pour que le point ne sorte pas de la fenêtre :)

Bref, je ne vois pas le problème  :(
Si vous le souhaitez je peux vous fournir le code en entier, il n'est pas très long, et je l'ai commenté.

Merci d'avance !  :)

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
Re : Problème de collision entre deux CircleShape
« Réponse #1 le: Février 22, 2014, 06:42:24 pm »
J'ai eu le même problème, en faite il faut que tu mette les
Citer
FloatRect box1 = cercle1.getGlobalBounds()
dans la boucle ( a la suite de "while (window.isOpen())" )  sinon il ne sont plus actualiser. Si cela ne marche pas met le code complet.

clavos

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : Problème de collision entre deux CircleShape
« Réponse #2 le: Février 22, 2014, 06:58:39 pm »
Merci pour la réponse ;)
Cependant je l'avais déjà mis dans la boucle :(

Voici le code complet :
        RenderWindow window(VideoMode(800, 400), "Test");//Création de la fenêtre

        CircleShape cercle2(70);//Création du point rouge immobile
        cercle2.setFillColor(Color::Red);
        cercle2.setPosition(330,130); // On place le point rouge au centre
        FloatRect box2 = cercle2.getGlobalBounds();//On récupère le cadre autour de la forme

        CircleShape cercle1(50);// Création du point vert déplacable
        cercle1.setFillColor(Color::Green);
        FloatRect box1 = cercle1.getGlobalBounds();//On récupère le cadre autour de la forme

        int d=0,e=0; // Coordonnées du point vert

        while (window.isOpen())//Boucle principale
        {
                Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == Event::Closed)
                                window.close();
                }
                if (sf::Keyboard::isKeyPressed(Keyboard::Right))//Déplacement vers la droite
                {
                        if (d<700 && !(box1.intersects(box2))) {        d=d+1;}// Test si on peux déplacer
                        cercle1.setPosition(d, e);
                        window.clear();
                        window.draw(cercle1);
                        cout<<d<<"    "<<e<<endl;



                }
                if (sf::Keyboard::isKeyPressed(Keyboard::Left))//Déplacement vers la gauche
                {
                        if (d>0 && !(box1.intersects(box2))) {  d=d-1;}// Test si on peux déplacer
                        cercle1.setPosition(d, e);
                        window.clear();
                        window.draw(cercle1);
                        cout<<d<<"    "<<e<<endl;



                }
                if (sf::Keyboard::isKeyPressed(Keyboard::Up))//Déplacement vers le haut
                {
                        if (e>0 && !(box1.intersects(box2))) {  e=e-1;}// Test si on peux déplacer
                        cercle1.setPosition(d, e);
                        window.clear();
                        window.draw(cercle1);
                        cout<<d<<"    "<<e<<endl;



                }
                if (sf::Keyboard::isKeyPressed(Keyboard::Down))//Déplacement vers le bas
                {
                        if (e<300 && !(box1.intersects(box2))) {        e=e+1;}// Test si on peux déplacer
                        cercle1.setPosition(d, e);
                        window.clear();
                        window.draw(cercle1);
                        cout<<d<<"    "<<e<<endl;



                }


                if (sf::Keyboard::isKeyPressed(Keyboard::I))// En pressant "I", on a des infos sur la collision
                {
                        if (box1.intersects(box2))
                        {
                                cout<<"Il y a collision ! "<<endl;
                        }
                        if (!(box1.intersects(box2)))
                        {
                                cout<<"Il n'y a pas de collision ! "<<endl;
                        }
                }
       
        FloatRect box2 = cercle2.getGlobalBounds();//On récupère le cadre autour de la forme
        FloatRect box1 = cercle1.getGlobalBounds();//On récupère le cadre autour de la forme

                //Actualise la fenêtre
                window.clear();
                window.draw(cercle2);
                window.draw(cercle1);
                window.display();
        }

        return 0;

Le " cout<<d<<"   "<<e<<endl; " et l'événement I sont des infos dans la console qui étaient la pour m'aider, ça n'influe pas sur le programme.

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
Re : Problème de collision entre deux CircleShape
« Réponse #3 le: Février 22, 2014, 08:01:29 pm »
ok essai d'enlever ceux or de la boucle

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Problème de collision entre deux CircleShape
« Réponse #4 le: Février 22, 2014, 09:38:43 pm »
Déjà tous tes clear et draw à l'intérieur de tes if(sf::Keyboard::isKeyPressed........ ne servent à rien puisque à la fin de la boucle tu reclear tout et redessine tes 2 cercles (ce qui est ce qu'il faut faire ^^).

Ensuite tu déclares une première fois box2 et box1 avant ta boucle principale. Puis tu les redéclares une première fois à la fin de ta boucle. Je ne sais pas ce que ça fait réellement mais rien de bien à mon avis, et je serais étonné que ton compilateur ne t'indique pas que c'est quelque chose de douteux.
Donc soit tu déclares box1 et 2 en dehors de ta boucle et leur assignes une nouvelle valeur à chaque tour de boucle. Soit tu les déclares à l'intérieur de la boucle en leur assignant directement leur valeur (avant de t'en servir bien sûr, sinon ces variables n'existent pas encore).
Ou alors t'utilises directement getGlobalBounds.

clavos

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : Problème de collision entre deux CircleShape
« Réponse #5 le: Février 23, 2014, 01:24:58 am »
J'ai enlevé ceux en dehors de la boucle et ... ca a fonctionné !  ;D
Merci beaucoup pour votre aide  :)

Maintenant ca a engendré d'autre bug, mais je verrais par moi même  :P
« Modifié: Février 23, 2014, 11:01:47 am par clavos »

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
Re : Problème de collision entre deux CircleShape
« Réponse #6 le: Février 23, 2014, 10:23:22 pm »
Si tu trouve pas passe par le fofo.