Partage
  • Partager sur Facebook
  • Partager sur Twitter

SFML: afficher plusieurs formes simultanément

Sujet résolu
    22 février 2024 à 11:11:52

    Bonjour. Je suis débutant en c++ et je suis entrain d'apprendre SFML. J'ai codé un petit programme pour afficher simultanément plusieurs formes de taille, de couleur et de position différente à l'écran, mais je ne comprends pas pourquoi il ya juste une forme qui s'affiche quand le code est exécuté. Aidez-moi s'il vous plaît. 

    #include <SFML/Graphics.hpp>
    
    #include <stdlib.h>     /* srand, rand */
    #include <time.h>       /* time */
    
    #include <iostream>
    
    using std::vector;
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    
    
    int main()
    {
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!");
    
        vector<sf::RectangleShape> vecRec(25);
    
        srand(time(NULL));
    
        int r, g, b = rand()%255+1;
    
        sf::Vector2f recSize(rand()%40+20, rand()%40+20);
        sf::Vector2f recPos(rand()%760+1, rand()%560+1);
    
        while (window.isOpen()) {
            sf::Event event;
            while (window.pollEvent(event)) {
                if (event.type == sf::Event::Closed)
                    window.close();
            }
    
            window.clear();
    
    
            sf::RectangleShape rec;
            rec.setFillColor(sf::Color(r,g,b));
            rec.setSize(recSize);
            rec.setPosition(recPos);
            vecRec.push_back(rec);
    
            /*for(auto& r: vecRec){
                window.draw(r);
            }*/
    
            for(int i=0; i<vecRec.size();i++){
                window.draw(vecRec[i]);
            }
    
    
            window.display();
        }
    
        return 0;
    }



    • Partager sur Facebook
    • Partager sur Twitter
      22 février 2024 à 11:31:35

      Bonjour,

      peut-être parce qu'à chaque tour de boucle while, tu effaces la fenêtre avant de dessiner un nouveau rectangle:

      window.clear();

      • Partager sur Facebook
      • Partager sur Twitter
        22 février 2024 à 13:26:20

        Salut,

        Tu commences par calculer la couleur, la taille et la position des rectangle en dehors de la boucle.
        Puis, dans la boucle d'affichage, tu instancies un seul rectangle avec une couleur, une taille et position qui n'a pas été recalculée.
        En conclusion, ils sont tous parfaitement superposés.

        PS:
        Avec un vector qui ne fait que grandir, je me demande comment un tel programme ne finit pas par planter.

        • Partager sur Facebook
        • Partager sur Twitter
          22 février 2024 à 17:35:54

          Merci pour vos réponses @Phil_1857 et @Deedolith. Mais je ne suis pas sûr de comprendre vos explications. Pouvez-vous donner un exemple avec du code?
          • Partager sur Facebook
          • Partager sur Twitter
            22 février 2024 à 18:07:06

            Exécute en pas à pas,
            met des espions (utilises le debugger de ton IDE),
            et tu t'apercevras que r, g, b, recSize, recPos ne changent jamais dans ta boucle d'affichage (entre les lignes 29 et 55 du source que tu nous as posté).

            quand a la solution, pour un programme aussi simple, si tu ne la voit pas, il faut peut-être revoir les fondamentaux (notions de variable, portée, décisions, boucles).

            • Partager sur Facebook
            • Partager sur Twitter
              22 février 2024 à 18:19:10

              Autrement dit, tous les rectangles sont au même endroit.

              • Partager sur Facebook
              • Partager sur Twitter
                23 février 2024 à 4:22:30

                Le problème est résolu. Merci à vous.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 février 2024 à 19:29:06

                  [ Ah le site est réparé on dirait ]

                  Autres problèmes avec la ligne 24

                  • Les variables r et g ne sont pas initialisées ;
                  • La variable b ne peut pas prendre la valeur 0.

                  Pour le premier problème, il faut configurer l'environnement de programmation lourd que le compilateur, qui est notre ami, donne des avertissements, genre :

                        Ligne 40 on utilise r et g qui n'ont pas été initialisés. 

                  Pour le second : Le modulo 255 donne une valeur entre 0 et 254 compris, en ajoutant 1 ça fait  de 1 à 255. Pourquoi exclure 0 ?

                  Solution : rand() % 256 

                  Mieux : définir et utiliser une fonction qui retourne une couleur aléatoire. Comme ça la ligne 40 ca serait

                  rec.setFillColor(randomColor());

                  si chaque rectangle doit avoir une couleur aléatoire spécifique.

                  Dans le même ordre d'idée, le main serait plus simple  avec 

                     vec.push_back( randomRectangle() );

                  en déléguant les détails sordides de la fabrication des rectangles.


                  -
                  Edité par michelbillaud 29 février 2024 à 8:14:30

                  • Partager sur Facebook
                  • Partager sur Twitter

                  SFML: afficher plusieurs formes simultanément

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown