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

Auteur Sujet: [Résolu] Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()  (Lu 4219 fois)

0 Membres et 2 Invités sur ce sujet

Skima

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Bonjour,

J'essaye d'afficher des "touches" de clavier comportant un rectangle (dessin de la touche) et un sf::Text (valeur de la touche).
Je voulais donc positionner le contenu en fonction de la taille de la lettre.
J'ai donc écrit :

Dessin du rectangle :
    sf::VertexArray rectangle(sf::Quads, 4);
    rectangle[0].position = sf::Vector2f(x, y);
    rectangle[1].position = sf::Vector2f(x+width, y);
    rectangle[2].position = sf::Vector2f(x+width, y+height);
    rectangle[3].position = sf::Vector2f(x, y+height);
    sf::Color sfBackgroundColor(backgroundColor['r'], backgroundColor['g'], backgroundColor['b']);
    rectangle[0].color = sfBackgroundColor;
    rectangle[1].color = sfBackgroundColor;
    rectangle[2].color = sfBackgroundColor;
    rectangle[3].color = sfBackgroundColor;

    keyboard->getWindow()->draw(rectangle);
 

Ecriture de la lettre :
    sf::Color sfFontColor(fontColor['r'], fontColor['g'], fontColor['b']);
    text->setString(value);
    text->setColor(sfFontColor);

    sf::FloatRect bounds = text->getGlobalBounds();
    int xBounds = (width - bounds.width) /2;
    int yBounds = (height - bounds.height) /2;
    text->setPosition(x+xBounds ,y+yBounds);
   
    keyboard->getWindow()->draw(*text);
 

Le sf::Text est initialisé dans le constructeur de ma classe :
    this->text = new sf::Text();

    this->font = new sf::Font();
    font->loadFromFile("font/arial.TTF");

    text->setFont(*font);

    text->setCharacterSize(fontSize);
    text->setPosition(x, y);
    text->move(15, 5);
 

Quand je lance ça, j'ai un décalage en y entre la position prévue de la lettre (x+xBounds, y+yBounds) et l'affichage effectif :


(J'ai dessiné en rouge le rectangle représentant la position attendue de la lettre :
        sf::VertexArray rectText(sf::Quads, 4);
        rectText[0].position = sf::Vector2f(x+xBounds, y+yBounds);
        rectText[1].position = sf::Vector2f(x+xBounds+bounds.width, y+yBounds);
        rectText[2].position = sf::Vector2f(x+xBounds+bounds.width, y+yBounds+bounds.height);
        rectText[3].position = sf::Vector2f(x+xBounds, y+yBounds+bounds.height);
        rectText[0].color = sf::Color::Red;
        rectText[1].color = sf::Color::Red;
        rectText[2].color = sf::Color::Red;
        rectText[3].color = sf::Color::Red;

        keyboard->getWindow()->draw(rectText);
 
)

D'où peut venir se décalage ? Comment puis-je régler ça ?

Merci d'avance :)
« Modifié: Juin 01, 2014, 09:13:31 pm par Skima »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
« Réponse #1 le: Juin 01, 2014, 11:14:50 am »
Les x et y des localBounds d'un texte ne sont pas 0

Skima

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Les x et y des localBounds d'un texte ne sont pas 0

Du coup ça veut dire quoi ? Il faut que j'utilise une autre méthode ? Que je calcule le "décalage" ? Si oui, comment ? :/

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
« Réponse #3 le: Juin 01, 2014, 12:23:50 pm »
Il faut simplement ajuster ton calcul. Actuellement tu centres un rectangle défini par (0, 0, width, height). Fais le pour un rectangle (left, top, width, height). Je te laisse le soin de voir comment utiliser bounds.left et bounds.top à bon escient ;)
Laurent Gomila - SFML developer

Skima

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
« Réponse #4 le: Juin 01, 2014, 03:52:17 pm »
Je dois rater un truc, mais je ne comprends pas :/
J'ai essayé

text->setPosition(x+xBounds,y+yBounds-bounds.top);
Puis j'ai regardé les valeurs de bounds.top qui sont en fait les x/y du text en fonction du 0;0 de la fenêtre (c'est bien ça ?)

Donc j'ai essayé ça :

text->setPosition(x+xBounds,y+yBounds-(bounds.top-x));

Mais ça ne change pas mon problème (et ça en crée même un nouveau : les lettres "bougent" une fois collées en haut à gauche du rectangle, une fois centrées toujours avec le décalage)

Je comprends le principe des left/top, mais je n'arrive pas à l'appliquer :/

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
« Réponse #5 le: Juin 01, 2014, 06:51:22 pm »
N'essaye pas des trucs au hasard. Fais un dessin, c'est pas compliqué, ce ne sont que des rectangles alignés après tout. Si on te donne la réponse toute cuite ça ne sera pas drôle.
Laurent Gomila - SFML developer

Skima

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
« Réponse #6 le: Juin 01, 2014, 07:06:40 pm »
Justement, je l'ai fait ce dessin ... je ne dois pas bien comprendre comment marche le GlobalBounds alors ...

Voilà une reproduction de mon dessin :P

Admirez le côté artistique !

Je suis à côté de la plaque ? (surement, sinon ma solution devrait marcher ...)

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
« Réponse #7 le: Juin 01, 2014, 07:29:44 pm »
Tu vois la différence entre ton cadre rouge et bounds.width et height ?
Ben c'est à cause du bounds.left et top des localBounds de ton texte.

Skima

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
« Réponse #8 le: Juin 01, 2014, 08:19:20 pm »
C'est bon ça marche !!
Merci beaucoup, j'avais en effet confondu global et local ... du coup j'avais la logique du local mais en utilisant l'autre --'

Bref, c'est nickel !
Merci !

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
C'est sûr ça devait marcher moins bien. :P

 

anything