-
Salut,
j'utilise les view dans mon programme "gui" est lorsque j'utilise une vue est que je modifie le viewport le bouton garde bien ses formes mais pas le texte, comment faire pour que le sf::Text n'apparaissent pas flou ?
merci.
-
Un peu plus de précisions seraient les bienvenues. Tu modifies le viewport de quelle manière ? Tu étires quelque chose ou bien tu gardes les dimensions initiales ? Tu places ta vue à des coordonnées décimales ou bien tu gardes des coordonnées entières ? Ca veut dire quoi "ne garde pas ses formes" ? C'est flou dans quelles proportions ? Tu aurais un screenshot ?
-
Alors,
j'inialise le viewport à la main pour l'instant, c'est à dire que j'ai touché jusqu’à que les boutons ait les mêmes dimensions.
Voici les screens :
(http://img11.hostingpics.net/thumbs/mini_622180sans.png) (http://www.hostingpics.net/viewer.php?id=622180sans.png)
(http://img11.hostingpics.net/thumbs/mini_774760avec.png) (http://www.hostingpics.net/viewer.php?id=774760avec.png)
-
Tu veux dire que tu ne calcules pas ton viewport en fonction de la position et taille de ta fenêtre interne ? Tu as trouvé des valeurs de manière empirique ?
-
Oui c'etait pour tester, mais si je le calcule je n'aurais plus ce flou ?
-
Si la taille du viewport correspond exactement à la taille de la vue, il ne devrait y avoir aucune distorsion et donc aucun flou.
-
D'accord merci !
-
Je comprend pas, quand je place les 2 images à coté j'ai l'impression que sans les view les boutons sont plus grand alors que sur paint il font bien 108x38...
Voici la vue
sf::View view(sf::FloatRect(210, 73, 280, 469));
view.setViewport(sf::FloatRect(0.2625f, 0.1216666666666667f, 0.35f, 0.7816666666666667f));
la fenetre fait 800/600.
(http://img11.hostingpics.net/thumbs/mini_721952avec.png) (http://www.hostingpics.net/viewer.php?id=721952avec.png)
(http://img11.hostingpics.net/thumbs/mini_156044sans.png) (http://www.hostingpics.net/viewer.php?id=156044sans.png)
-
Pourquoi pas "210 / 800", "73 / 600", etc. au lieu de ces valeurs décimales qui sortent de nulle part ? ;)
-
sf::View view(sf::FloatRect(210, 73, 280, 469));
view.setViewport(sf::FloatRect((float)210/800, (float)73/600, (float)280/800, (float)469/600));
C'est pareille :/
-
Dans ce cas, écris un code complet minimal qui reproduit le problème, et je testerai ça. Par "minimal" j'entends un viewport et un sf::Text dans un main(), pas ton application originale.
-
Voilà
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "Test lib");
window.setFramerateLimit(60);
// GUI
gui::EngineManager *engine = gui::EngineManager::GetInstance();
engine->AddScene(window);
gui::Window *fenetre = new gui::Window("JE SUIS UNE FENETRE", 200, 50, 300, 500);
sf::RectangleShape rect1(sf::Vector2f(108, 38));
rect1.setPosition(sf::Vector2f(220, 75));
sf::RectangleShape rect2(sf::Vector2f(108, 38));
rect2.setPosition(sf::Vector2f(338, 75));
sf::RectangleShape rect3(sf::Vector2f(108, 38));
rect3.setPosition(sf::Vector2f(220, 120));
sf::Font font; font.loadFromFile("Fonts/BorisBlackBloxx.ttf");
sf::Text text1("Bouton 1", font, 15);
text1.setColor(sf::Color::Black);
text1.setPosition(rect1.getPosition().x + 20, rect1.getPosition().y + 7);
sf::Text text2("Bouton 2", font, 15);
text2.setColor(sf::Color::Black);
text2.setPosition(rect2.getPosition().x + 20, rect2.getPosition().y + 7);
sf::Text text3("Bouton 3", font, 15);
text3.setColor(sf::Color::Black);
text3.setPosition(rect3.getPosition().x + 20, rect3.getPosition().y + 7);
// Scrolling
sf::View view(sf::FloatRect(210, 73, 280, 469));
view.setViewport(sf::FloatRect((float)210/800, (float)73/600, (float)280/800, (float)469/600));
while(window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if(event.type == sf::Event::Closed)
window.close();
engine->HandleEvent(event);
fenetre->Update();
}
window.clear(sf::Color::Black);
window.setView(window.getDefaultView());
fenetre->Draw();
window.setView(view);
window.draw(rect1);
window.draw(rect2);
window.draw(rect3);
window.draw(text1);
window.draw(text2);
window.draw(text3);
window.display();
}
engine->kill();
return 0;
}
-
J'avais pourtant bien précisé ce que je demandais.
Par "minimal" j'entends un viewport et un sf::Text dans un main(), pas ton application originale.
C'est pas clair ?
En plus comment veux-tu que je teste ça, le code n'est même pas complet. Je la sors de mon c** la gui::Window ? ;)
-
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "Test lib");
window.setFramerateLimit(60);
sf::RectangleShape rect1(sf::Vector2f(108, 38));
rect1.setPosition(sf::Vector2f(220, 75));
sf::RectangleShape rect2(sf::Vector2f(108, 38));
rect2.setPosition(sf::Vector2f(338, 75));
sf::RectangleShape rect3(sf::Vector2f(108, 38));
rect3.setPosition(sf::Vector2f(220, 120));
sf::Font font; font.loadFromFile("Fonts/BorisBlackBloxx.ttf");
sf::Text text1("Bouton 1", font, 15);
text1.setColor(sf::Color::Black);
text1.setPosition(rect1.getPosition().x + 20, rect1.getPosition().y + 7);
sf::Text text2("Bouton 2", font, 15);
text2.setColor(sf::Color::Black);
text2.setPosition(rect2.getPosition().x + 20, rect2.getPosition().y + 7);
sf::Text text3("Bouton 3", font, 15);
text3.setColor(sf::Color::Black);
text3.setPosition(rect3.getPosition().x + 20, rect3.getPosition().y + 7);
// Scrolling
sf::View view(sf::FloatRect(210, 73, 280, 469));
view.setViewport(sf::FloatRect((float)210/800, (float)73/600, (float)280/800, (float)469/600));
while(window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if(event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::Black);
window.setView(view);
window.draw(rect1);
window.draw(rect2);
window.draw(rect3);
window.draw(text1);
window.draw(text2);
window.draw(text3);
window.display();
}
return 0;
}
-
Ce code fonctionne très bien chez moi, j'ai le même résultat au pixel près avec et sans la vue.
-
C'est le 2éme boutton qui fait 107x38...
-
Tu sais d'où ça pourrait venir ?
car le 1er et 3éme bouton ont la bonne dimensions mais pas le 2éme...
-
Aucune idée. Comme je te l'ai dit, chez moi ça fonctionne parfaitement.
-
Alors, ça fonctionne avec comme valeur (0, 0, 800, 600) je pense que ma différence de 1px viens du résultat de la division..
-
Il y a que comme ça que j'ai la bonne dimensions (281/800) car avec (280/800) j'ai 107x38 pour le deuxième carré.
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "Test lib");
window.setFramerateLimit(50);
sf::RectangleShape rect1(sf::Vector2f(108, 38));
rect1.setPosition(sf::Vector2f(220, 75));
sf::RectangleShape rect2(sf::Vector2f(108, 38));
rect2.setPosition(sf::Vector2f(338, 75));
sf::RectangleShape rect3(sf::Vector2f(108, 38));
rect3.setPosition(sf::Vector2f(220, 120));
// Scrolling
sf::View view(sf::FloatRect(210, 73, 280, 469));
view.setViewport(sf::FloatRect((float)210/800, (float)73/600, (float)281/800, (float)469/600));
while(window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if(event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::Black);
window.setView(view);
window.draw(rect1);
window.draw(rect2);
window.draw(rect3);
window.display();
}
return 0;
}
-
Et quand je parle que le rect à 1px en - c'est quand je regarde sur paint et que je fait la comparaison avec et sans la vue.
-
Peut-être hors sujet, mais je te conseillerais de faire 281./800 plutôt qu'un cast sans parenthèses de 281. En effet, il suffit d'un seul float dans un calcul pour que le calcul soit effectué en flotants et non pas en entiers, et le point suffit à lui-seul pour la conversion.