1
Fenêtrage / 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 :
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 :
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.
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;
}
{
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.