Bonjour
Je suis en train d'implémenter un brouillard de guerre, comme sur cette image :
https://zalifalcam.files.wordpress.com/2014/07/13.pngTrois possibilités donc :
Noir : jamais exploré
Noir-transparent : pas dans le champs de vision
Transparent : dans le champs de vision
J'ai fait ça avec une sf::VertexArray, pour l'instant, mais des fois ça foire un peu, l'écran reste transparent à certains endroits après le passage de la souris, alors qu'il ne devrait plus l'être.
int main()
{
sf::Texture texture;
texture.loadFromFile(blabla...);
sf::Sprite sprite;
sprite.setTexture(texture);
sf::VertexArray vertexArray(sf::Points);
// On colorie tout en noir
for (unsigned i=0; i<480; i++)
for (unsigned j=1; j<=360; j++)
vertexArray.append({sf::Vector2f(i,j),sf::Color(0,0,0,255)});
sf::RenderWindow window(sf::VideoMode(480,360),"SFML window",sf::Style::None);
sf::Event event;
sf::Vector2i mousePosition;
while (window.isOpen())
{
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
window.close();
}
else if (event.type == sf::Event::KeyPressed)
{
if (event.key.code == sf::Keyboard::Escape)
{
window.close();
}
}
else if (event.type == sf::Event::MouseMoved)
{
// On colorie tout en "noir transparent" autour de l'ancienne position de la souris
for (unsigned i=mousePosition.x-50; i<mousePosition.x+50; i++)
for (unsigned j=mousePosition.y-50; j<mousePosition.y+50; j++)
vertexArray[360*i+j].color.a = 150;
// On colorie tout en transparent autour de la nouvelle position de la souris
for (unsigned i=event.mouseMove.x-50; i<event.mouseMove.x+50; i++)
for (unsigned j=event.mouseMove.y-50; j<event.mouseMove.y+50; j++)
vertexArray[360*i+j].color.a = 0;
mousePosition = sf::Mouse::getPosition(window);
}
}
window.clear();
window.draw(sprite);
window.draw(vertexArray);
window.display();
}
return 0;
}
Comment pourrais-je coder ça plus proprement ? Obligé de passer par OpenGL ?