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
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.
Grid.cpp|80|error: conversion from 'std::vector<sf::RectangleShape>::const_iterator {aka __gnu_cxx::__normal_iterator<const sf::RectangleShape*, std::vector<sf::RectangleShape> >}' to non-scalar type 'std::vector<sf::RectangleShape>::iterator {aka __gnu_cxx::__normal_iterator<sf::RectangleShape*, std::vector<sf::RectangleShape> >}' requested|
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
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)
{
...
}
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).