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

Auteur Sujet: afficher std::vector<sf::RectangleShape>  (Lu 2293 fois)

0 Membres et 1 Invité sur ce sujet

Blenderiste09

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
afficher std::vector<sf::RectangleShape>
« le: Septembre 15, 2017, 05:15:37 pm »
Bonjour,
Je suis en train d'essayer de réaliser un tout simple Conway's game of life.
J'aimerais créer des cellules composées dans un premier temps de sf::RectangleShape le tout contenu dans std::vector.

Problème, lors de l'appel de la fonction window.draw(), rien ne s'affiche.
Voici la partie qui cause problème:

#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;

int main()
{
    int windowX = 800, windowY = 600, gridSize = 10;
    sf::RenderWindow window(sf::VideoMode(windowX, windowY), "Game of Life");

    //Rectangle qui sera inséré dans le vector
    sf::RectangleShape rect;
    rect.setFillColor(sf::Color(250, 0, 0));
    rect.setScale(gridSize, gridSize);

    vector<sf::RectangleShape> rectArray;

    for(int y(0); y < windowY; y += gridSize)
    {
        for(int x(0); x < windowX; x += gridSize)
        {
            rect.setPosition(x, y); //Position de chaque cellules de la grille
            rectArray.push_back(rect);
        }
    }


        window.clear();

        for(vector<sf::RectangleShape>::iterator it = rectArray.begin(); it != rectArray.end(); it++)
            window.draw(*it);

        window.display();

        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                }

        }

        return 0;
}
 

Cette manière de faire est provisoire car je pense que je passerai par un sf::VertexArray au final, mais je voudrais quand même comprendre.

Pourriez-vous m'aider ?

Merci d'avance

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: afficher std::vector<sf::RectangleShape>
« Réponse #1 le: Septembre 15, 2017, 05:40:00 pm »
Ne confond pas la taille (setSize) et le facteur d'étirement (setScale) ;)
Laurent Gomila - SFML developer

Blenderiste09

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: afficher std::vector<sf::RectangleShape>
« Réponse #2 le: Septembre 15, 2017, 07:52:28 pm »
Effectivement, bête erreur d'inattention ! :P Merci beaucoup.
Du coup le code fonctionne, et j'ai voulu l'intégrer dans la fonction draw d'une classe Grid que j'ai créé:
void Grid::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
        states.transform *= getTransform();

        target.draw(m_vertices, states); //D'autres formes dessinée avant les rectangles

        /*for(int i(0); i < m_rectArray.size(); i++)
        target.draw(m_rectArray[i]);*/
//Cette boucle fonctionne

        for(vector<sf::RectangleShape>::iterator it = m_rectArray.begin(); it != m_rectArray.end(); it++)
            target.draw(*it);
}
 

Cependant il me sort une autre erreur.
(click to show/hide)
Et j'avoue que j'ai du mal à la comprendre.


Ensuite, j'ai une deuxième question qui est en rapport avec le sujet.
Pour réduire le nombre de draw calls, je pense créer moi-même mes Rectangles en utilisant des VertexArray pour ne faire qu'un seul draw call.
Cependant je me demandait, est-ce qu'il n'y aurait pas un moyen de faire un seul draw call avec une sorte de VertexArray pour Rectangle ou autres formes plus complexes (autre que de faire un getPoint() et l'insérer dans un VertexArray) ?

Merci encore

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: afficher std::vector<sf::RectangleShape>
« Réponse #3 le: Septembre 15, 2017, 09:24:57 pm »
m_rectArray est const dans cette fonction, puisque c'est un membre de la classe et que la fonction est const elle-même. Il te faut donc un const_iterator.

Ou alors...

for (const auto& rect : m_rectArray)
{
    ...
}

Citer
Cependant je me demandait, est-ce qu'il n'y aurait pas un moyen de faire un seul draw call avec une sorte de VertexArray pour Rectangle ou autres formes plus complexes
Je ne comprends pas très bien ta question. Un vertex array contient des points qui forment des primitives, il n'y a pas de notion de forme complexe, là on est un cran plus bas niveau, c'est à toi de définir tes formes à partir des primitives de base disponibles (des triangles, ou si tu te fiches de la compatibilité, des quads).
Laurent Gomila - SFML developer

Blenderiste09

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: afficher std::vector<sf::RectangleShape>
« Réponse #4 le: Septembre 18, 2017, 09:52:01 pm »
Salut !
Merci beaucoup pour ta réponse, c'était tout bête.
Citer
Cependant je me demandait, est-ce qu'il n'y aurait pas un moyen de faire un seul draw call avec une sorte de VertexArray pour Rectangle ou autres formes plus complexes
Je ne comprends pas très bien ta question. Un vertex array contient des points qui forment des primitives, il n'y a pas de notion de forme complexe, là on est un cran plus bas niveau, c'est à toi de définir tes formes à partir des primitives de base disponibles (des triangles, ou si tu te fiches de la compatibilité, des quads).

La question pourrait-être tournée comme ça : Est-ce que l'on peut faire un seul appel à draw() pour dessiner plusieurs cercles par exemple ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: afficher std::vector<sf::RectangleShape>
« Réponse #5 le: Septembre 18, 2017, 10:40:03 pm »
Bien sûr. La forme la plus flexible de primitive est sf::Triangles, qui est une simple liste de triangles n'ayant rien en commun. Partant de là, tu peux mettre tout ce que tu veux dans un unique vertex array.
Laurent Gomila - SFML developer