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

Auteur Sujet: Différence window::setSize et recréer la sf::Window  (Lu 1927 fois)

0 Membres et 1 Invité sur ce sujet

leandrim

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
    • E-mail
Différence window::setSize et recréer la sf::Window
« le: Décembre 18, 2017, 06:21:52 pm »
Bonjour,

C'est mon premier poste sur ce forum donc j'espère être dans la bonne section.

J'essaie dans l'application que je développe actuellement de mettre en place un système qui permetrait a l'utilisateur de changer la résolution de l'appli, mais je me heutre a un petit problème :
en effet lorsque je tente de modifier la fenêtre avec la fonction sf::window::setSize([...]) la fenêtre change bien, mais je ne comprend pas le comportement des choses qui sont afffichées à l'interieur.
Un petit code minimal pour comprendre mon problème :

int main()
{
    sf::RenderWindow    win(sf::VideoMode(800, 600), "SFML minimal code");
    sf::RectangleShape  rect(sf::Vector2f(50, 50));
    sf::Clock           clock;
    sf::Event           ev;
    bool                oneTime = true;

    rect.setFillColor(sf::Color::Green);
    clock.restart();
    while (win.isOpen())
    {
        if (clock.getElapsedTime() >= sf::seconds(5) && oneTime)
        {
            // l'utilisateur demande de changer la resolution ( simulé ici au bout de 5 secondes )
            oneTime = false;
            win.setSize(sf::Vector2u(1000, 750));
            // l'autre possibilité : win.create(sf::VideoMode(1000, 750), "sfml minimal");
        }

        while(win.pollEvent(ev))
        {
            if (ev.type == sf::Event::Closed)
                win.close();
        }
        rect.setPosition(win.getSize().x / 2 - 25, win.getSize().y / 2 - 25);
        win.clear(sf::Color::Black);
        win.draw(rect);
        win.display();
    }

    return 0;
}
 

Le problème ici c'est qu'après le resize de la fenêtre, le carré n'est plus du tout au milieu, pourquoi ?

La solution que j'ai trouvé pour palier a ce probleme est de recrée la fenetre avec de nouveau parametre via :
win.create(sf::VideoMode(1000, 750), "sfml minimal");

Mais au final, quelle différence entre sf::Window::setSize() et sf::Window::create ? que fait réellement setSize() ?

Merci d'avoir pris le temps de lire ce poste,
je reste dispo pour toute questions.

Lean.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Différence window::setSize et recréer la sf::Window
« Réponse #1 le: Décembre 18, 2017, 10:49:18 pm »
Entre ce que tu dessines et la fenêtre il y a une vue (sf::View) qui définit le système de coordonnées. Lis le tutoriel correspondant, et notamment le paragraphe expliquant ce qui se passe lorsque la fenêtre est redimensionnée, ainsi que le code très simple qui permet d'adopter un autre comportement que celui que tu constates.
Laurent Gomila - SFML developer