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

Auteur Sujet: sf::Text Local Bounds innatendues  (Lu 3051 fois)

0 Membres et 1 Invité sur ce sujet

Fugius

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
sf::Text Local Bounds innatendues
« le: Mai 27, 2018, 07:41:44 am »
Salut, j'ai un comportement bizarre avec sf::text (plusieurs en fait, mais un sel que je n'arrive pas a regler).

A chaque fois que je cree un text, quelle que soit la police, lorsque j'utilise setPosition, le texte s'affiche légerement décalé, je me suis amusé à afficher sa bounding box pour voir (avec getLocalBounds pour sa taille et getSize pour sa position) et je me retrouve avec ce résultat incompréhensible :

J'ai vérifie plusieurs choses :
-L'origine est bien en 0, 0
-Si j'utilise getPosition au moment de l'affichage j'ai bien la position de la bounding box (la ou le texte devrait être)
-Si j'utilise getlocalBounds je vois que top est à 16 (ce qui explique le décalage) mais je ne sais ni d'ou ca viens, ni comment changer cette valeur
-J'ai repris 3 autres projets ou j'ai utilisé sfml, j'ai ajouté un texte simple et affiché leur bounding box, a chaque fois j'ai un décalage qui varie sur X entre 0 et 1 et sur Y entre 0 et 20, et je n'arrive pas a l'expliquer du tout.
-J'ai essayé sur chaque projet d'utiliser Arial pour voir si c’était ma font qui avait un problème : même résultats

Pour info je suis sous Windows 10 64 bits, j'ai compilé sfml avec la dernière version de MingW64 et je compile en ligne de commande avec un packet Atom que j'ai modifié (mais je pense pas que ça change grand chose).

Voilà en espérant que vous ayez une solution, parce que je ne comprends pas du tout d’où viens le problème ^^

Edit : J'ai une solution (mais pas tres clean) qui consiste a faire ça a chaque fois que la position du texte est update
Citer
  text.setPosition(text.getPosition().x, text.getPosition().y - text.getLocalBounds().top);

Ce qui donne le resultat :


(pour l'autre problème, lorsqu'on stocke une font dans une struct et qu'on garde les strucs sous forme de pointeur (les anciens pas les automatiques) dans une classe pour manager soit même la mémoire, le texte clignote et le programme crash de manière random comme s'il perdait l'adresse de la font, du coup comme je n'utilise pas tant de fonts, je les charge en plusieurs fois si besoin)
« Modifié: Mai 27, 2018, 07:48:53 am par Fugius »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: sf::Text Local Bounds innatendues
« Réponse #1 le: Juin 03, 2018, 09:49:13 pm »
Le texte est aligné sur sa ligne de base (baseline), pas sur le haut contrairement aux autres classes affichables. C'est pourquoi il y a un décalage en haut -- c'est en quelque sorte la place pour afficher le plus haut caractère de la police.

Pour aligner sur le haut tu as donc trouvé qu'il faut retrancher getLocalBounds().top, ce qui est parfaitement logique et "clean".

Si tu as un autre souci sans rapport, ouvre un autre sujet, ça ne sert à rien de mélanger les problèmes si ce n'est apporter de la confusion ;)
Laurent Gomila - SFML developer

Koseki

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: sf::Text Local Bounds innatendues
« Réponse #2 le: Juin 21, 2018, 10:32:15 pm »
Bonjour,

J'ai aussi un problème avec getLocalBounds (voir l'image en pièce jointe)

m_title.setString(sf::String(text));
m_shape.setSize(sf::Vector2f(m_title.getLocalBounds().width,m_title.getLocalBounds().height));

Ici je donne un titre à mon bouton et pour tester ses dimensions(due à un problème pour centrer le texte par rapport au bouton) j'ai décider d'afficher un RectangleShape.
Sa hauteur a l'air bonne, mais sa largeur dépasse largement la largeur réelle du texte. D'ailleurs, plus la chaîne est longue, plus l'écart est important.

Edit: J'ai réussi à résoudre à peut près le problème:
m_title.setFont(m_font);
m_title.setFillColor(sf::Color::White);
m_title.setCharacterSize(20);

m_title.setString(sf::String("Mon Bouton"));
    m_shape.setSize(sf::Vector2f(m_title.getLocalBounds().width+m_title.getLocalBounds().left,m_title.getLocalBounds().height+m_title.getLocalBounds().top));

Ici, j'ai assigné ma chaîne après avoir donné les infos comme la police d'écriture et sa taille alors qu'avait j'avais appelé setText avant. Je ne pensais pas que l'ordre avait une importance ici, donc bien faire attention à ça.
Ensuite, j'avais toujours un décalage, sauf que cette fois-ci, la boite était plus petite que le texte, j'ai essayé d'ajouter left et top et ça a fonctionné.

Edit2: En fait, l'idéal est carrément d'ajouter left et top à la position du shape et non pas l'ajouter à sa taille:
m_shape.setPosition(sf::Vector2f(static_cast<float>(position.x)+m_title.getLocalBounds().left,static_cast<float>(position.y)+m_title.getLocalBounds().top));
    m_shape.setSize(sf::Vector2f(m_title.getLocalBounds().width+m_title.getLocalBounds().left,m_title.getLocalBounds().height));

(voir la seconde image jointe dans le message)
Ici, on vois que le shape prend la bonne taille par rapport au texte et se positionne très bien.
« Modifié: Juin 21, 2018, 10:41:14 pm par Koseki »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: sf::Text Local Bounds innatendues
« Réponse #3 le: Juin 22, 2018, 08:42:34 am »
Donc pour résumer, à la fin tu as trouvé qu'il fallait positionner ton rectangle au même endroit que le texte, et lui donner la même taille, pour avoir un résultat correct. Ce qui me semble tout à fait naturel et logique. Donc quel est ta question en fait ? Ton problème est-il résolu ou bien y a-t-il une question que j'ai loupée ?

Citer
Ici, j'ai assigné ma chaîne après avoir donné les infos comme la police d'écriture et sa taille alors qu'avait j'avais appelé setText avant. Je ne pensais pas que l'ordre avait une importance ici
Ca ne devrait pas en avoir, si tu as constaté un bug alors poste un code complet minimal qui illustre le problème, qu'on puisse éventuellement corriger ça (ou t'indiquer quelle erreur tu as commise, le cas échéant).
Laurent Gomila - SFML developer