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

Auteur Sujet: Brouillard de guerre avec une sf::VertexArray  (Lu 1666 fois)

0 Membres et 1 Invité sur ce sujet

DrPapino

  • Newbie
  • *
  • Messages: 34
    • Voir le profil
Brouillard de guerre avec une sf::VertexArray
« le: Octobre 07, 2015, 04:33:02 pm »
Bonjour :)

Je suis en train d'implémenter un brouillard de guerre, comme sur cette image :
https://zalifalcam.files.wordpress.com/2014/07/13.png

Trois 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 ?

:D