Bonjour,
Je viens vous soumettre un problème (ou bug potentiel ?) avec sf::VertexArray
J'essaye de quadriller ma fenêtre avec des carrés blancs de 16pixels par 16.
Pour ça, j'utilise un sf::VertexArray(sf::Lines,2) pour dessiner des lignes horizontales et verticales.
Ma fenêtre fais 673 pixels (=16px*42+1)
Je devrais donc réussir à caser 43 lignes horizontales et 43 verticales.
Pas de problème pour les lignes horizontales. Par contre, pour les lignes verticales, tout est décalé de 1 pixel : la ligne verticale à x=0 ne s'affiche pas et la dernière ligne à s'afficher à pour coordonnée x = 671 au lieu de 672.
Voir le problème sur cet image (j'ai mis un fond rouge uniforme pour bien voir) :
J'ai refait un code minimal pour illustrer le problème.
Le style de la fenêtre est sf::Style::None pour qu'on puisse bien voir le problème.
La touche Echap quitte l'appli.
J'utilise SFML2 (RC) compilé avec MinGW 7.4
J'utilise la norme C++11
#include <iostream>
#include <SFML/Graphics.hpp>
int main(int argc, char** argv) {
//673 = 16*42+1
sf::RenderWindow mapWindow(sf::VideoMode(673, 673, 32), "Map", sf::Style::None);
mapWindow.setFramerateLimit(10);
while (mapWindow.isOpen())
{
sf::Event event;
while(mapWindow.pollEvent(event))
{
// Close Window (press escape)
if (event.type == sf::Event::Closed || ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)))
mapWindow.close();
// Mouse Debug
// Coin haut gauche : (0,0)
// Coin bas droite : (672,672)
if(event.type == sf::Event::MouseMoved)
std::cout << "x=" << sf::Mouse::getPosition(mapWindow).x << " ; y=" << sf::Mouse::getPosition(mapWindow).y << std::endl;
}
// Draw vertical lines
for(unsigned int i = 0; i <= mapWindow.getSize().x / 16; i++) {
sf::VertexArray vArray(sf::Lines, 2);
vArray[0].position = sf::Vector2f(i*16,0);
vArray[1].position = sf::Vector2f(i*16,mapWindow.getSize().y);
vArray[0].color = sf::Color::White;
vArray[1].color = sf::Color::White;
mapWindow.draw(vArray);
}
// Draw horizontal lines
for(unsigned int i = 0; i <= mapWindow.getSize().y / 16; i++) {
sf::VertexArray vArray(sf::Lines, 2);
vArray[0].position = sf::Vector2f(0,i*16);
vArray[1].position = sf::Vector2f(mapWindow.getSize().x,i*16);
vArray[0].color = sf::Color::White;
vArray[1].color = sf::Color::White;
mapWindow.draw(vArray);
}
// Display Window
mapWindow.display();
mapWindow.clear();
}
return 0;
}
C'est peut-être moi qui utilise mal le sf::vertexArray, il suffit que je rajoute un +1 lorsque je dessine mes lignes verticales, mais je ne trouve pas ça très logique.
++
Black Templar