Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Skima le Juin 01, 2014, 08:26:59 am

Titre: [Résolu] Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: Skima le Juin 01, 2014, 08:26:59 am
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 :

(http://img4.hostingpics.net/pics/264606LettreABug.jpg)
(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 :)
Titre: Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: G. le Juin 01, 2014, 11:14:50 am
Les x et y des localBounds d'un texte ne sont pas 0
Titre: Re : Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: Skima le Juin 01, 2014, 11:46:59 am
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 ? :/
Titre: Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: Laurent 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 ;)
Titre: Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: Skima 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 :/
Titre: Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: Laurent 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.
Titre: Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: Skima 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
(http://img15.hostingpics.net/pics/761810dessinsfml.jpg)
Admirez le côté artistique !

Je suis à côté de la plaque ? (surement, sinon ma solution devrait marcher ...)
Titre: Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: G. 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.
Titre: Re : Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: Skima 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 !
Titre: Re : [Résolu] Positionnement d'un sf::Text dans un rectangle avec getGlobalBounds()
Posté par: G. le Juin 02, 2014, 02:27:22 am
C'est sûr ça devait marcher moins bien. :P