Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: PetitPoney le Octobre 18, 2013, 12:39:00 am

Titre: Pixel clamping, problème de clignotement
Posté par: PetitPoney le Octobre 18, 2013, 12:39:00 am
Bonjour !  :)

Je cherche un moyen de régler un problème de "pixel clamping". En effet, lorsqu'un objet devient plus petit qu'un pixel, il se met à clignoter lors de déplacement, ce qui est tout à fait normal. Je cherche donc un moyen d'eviter ce problème en camplant la taille de mes objets à un pixel.

Un petit bout de code :

       

    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
     
    int main(void)
    {
      sf::RenderWindow window(sf::VideoMode(1000, 500), "test");
      sf::View view;
      view.setCenter(500, 250);
      view.setSize(4000, 2000);
     
      sf::RectangleShape rect;
      rect.setPosition(499, 0);
      rect.setSize(sf::Vector2f(2.0, 1000.0));
     
      while (window.isOpen())
        {
          sf::Event event;
          while (window.pollEvent(event))
            {
              if (event.type == sf::Event::Closed)
                window.close();
              else if (event.type == sf::Event::MouseWheelMoved)
                {
                  if (event.mouseWheel.delta > 0)
                    view.setSize(view.getSize().x + 20,
                                 view.getSize().y + 20);
                  else
                    view.setSize(view.getSize().x - 20,
                                 view.getSize().y - 20);
                }
     
              if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                view.move(-0.5, 0);
              else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                view.move(0.5, 0);
              window.setView(view);
            }
          window.clear();
          window.draw(rect);
          window.display();
        }
      return 0;
    }

 

Lors du lancement il n'y aura rien d'affiché. Utilisez les flèche de direction droite/gauche pour voir l'effet de clignotement.

Plusieurs pistes :

Cordialement

EDIT :
La première solution consisterait à ajouter dans la boucle quelque chose du genre :

while (rect.getGlobalBounds().width / view.getSize().x < 0.00078125)
   rect.scale(1.00001, 1.0);
// 0.00078125 = rect.getGlobalBounds().width / view.getSize().x   pour lequel il n'y a pas de clignotement (largeur du rectangle == 1 pixel physique)
 
Mais c'est vraiment moche :/
Titre: Re : Pixel clamping, problème de clignotement
Posté par: Laurent le Octobre 18, 2013, 08:04:11 am
Citer
Dans ce cas, comment calcul-t-on la correspondance entre un pixel physique et un pixel en coordonnée sfml ? (viewSize.x / windowResolution.x   ??)
Par exemple, oui. Pour être tout à fait exact il faudrait prendre en compte le viewport, mais si tu ne l'utilises pas tu peux l'ignorer.