Forum de la communauté SFML
Aide => Graphique => Discussion démarrée par: virelio le Avril 09, 2012, 02:47:04 pm
-
J'utilise le code ci-dessous pour centrer une lettre sur la position demiL, demiH.
Le centrage horizontal est correct mais le centrage vertical est mauvais et différent selon que la lettre est ronde (O, Q C) ou non.
sf::Glyph glyph = myFont.getGlyph( (sf::Uint32)myString[0], myText.getCharacterSize(), false);
sf::IntRect r = glyph.bounds;
myText.setPosition(demiL - (r.width - r.left)/2 - r.left, demiH + (r.top - r.height)/2 );
Quelle est la bonne méthode et à quoi correspond, du point de vue position r.top et r.left (r = glyph.bounds)
Assouan:
Pourquoi ne pas simplement faire :
myText.setPosition(demiL - (myText.setGlobalBounds().width / 2), demiH - (myText.getGlobalBounds().height / 2));
Ceci ne centre pas les lettres car le point d'origine de chaque lettre lui est propre afin d'assurer leur alignement horizontal sur "la ligne de base".
-
r.top représente le haut du glyphe, mais est relatif à la ligne de base. Donc elle sera négative. Dans ton cas, puisque tu ignores la ligne de base, il vaut mieux que tu utilises uniquement r.height, et que tu considères r.top à 0.
-
Et bien non Laurent... voilà ce qu'il faut faire :
sf::Glyph glyph = myFont.getGlyph( (sf::Uint32)myString[0], myText.getCharacterSize(), false);
sf::IntRect rg = glyph.bounds;
sf::FloatRect rt = myText.getGlobalBounds();
myText.setPosition(demiL - rg.width/2 - rg.left, demiH - rt.top + rg.top/2);
Autant le centrage droit-gauche est basique autant celui haut-bas est quand-même bizarre. J'ai testé avec différentes polices et différentes tailles : mes lettres restent parfaitement centrées.
J'aimerais maintenant les faire tourner autour de leur centre ces foutus lettres... (http://www.sfml-dev.org/forums/Smileys/default/huh.gif)
Je vais donc m'attaquer à règler setOrigin()...
-
myText.setOrigin(rg.width/2 + rg.left, rt.top - rg.top/2);
c'était simple ;)
-
Je suis pas sûr que ce soit la solution la plus logique, mais en tout cas bravo pour l'avoir trouvée ;D
Il faudrait que je fasse quelques tests pour t'en dire plus mais malheureusement je n'ai pas trop le temps en ce moment.