• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

dziwne zachowanie tekstu w SFML

VPS Starter Arubacloud
0 głosów
467 wizyt
pytanie zadane 23 kwietnia 2017 w C i C++ przez Pajdas Mądrala (5,930 p.)

Potrzebuję zrobić klasę która pomoże mi tworzyć przyciski.

Chcę aby w tym przycisku był tekst który będzie idealnie na środku, a więc na sf::Sprite jest sf::Text i to wszystko rysujemy.

Na mojej drodze napotkałem pewien problem

Poniższy kod pokarze wam o co chodzi:

#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;

int main()
{
    sf::RenderWindow window(sf::VideoMode(400, 400), "SFML works!");

    /// font
    sf::Font font;
    font.loadFromFile("font.ttf");

    /// text
    sf::Text text;
    text.setFont(font);
    text.setCharacterSize(60);
    text.setString("start");
    text.setFillColor(sf::Color::Black);

    /// texture
    sf::Texture texture;
    texture.loadFromFile("adres.png");

    /// sprite
    sf::Sprite sprite;
    sprite.setTexture(texture);

    /// shape
    sf::RectangleShape shape;
    shape.setSize(sf::Vector2f(text.getGlobalBounds().width,text.getGlobalBounds().height));
    shape.setFillColor(sf::Color(0,0,0,0));
    shape.setOutlineColor(sf::Color::Red);
    shape.setOutlineThickness(3);


    text.setPosition((sprite.getGlobalBounds().width-text.getGlobalBounds().width)/2+sprite.getGlobalBounds().left,
                     (sprite.getGlobalBounds().height-text.getGlobalBounds().height)/2+sprite.getGlobalBounds().top);
                     
    shape.setPosition((sprite.getGlobalBounds().width-text.getGlobalBounds().width)/2+sprite.getGlobalBounds().left,
                     (sprite.getGlobalBounds().height-text.getGlobalBounds().height)/2+sprite.getGlobalBounds().top);
    
    /// dla shape i dla text jest dokładnie takie samo ustawianie tekstu
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(sprite);
        window.draw(text);
        window.draw(shape);
        window.display();
    }

    return 0;
}

jak napisałem w komentarzu ustawianie pozycji shape i text jest dokładnie takie samo a efekt wygląda tak:

P.S. przy zamianie getGlobalBounds na getLocalBounds nie ma różnicy, tak samo przy ustawieniach okna sf::Style::Fullscreen (w fullscreen ma to działać i do tego dążę, jak ma działać tylko na jednym to na fullscreen)

proszę o pomoc i wytłumaczenie co się dokładnie tu dzieje :)

2 odpowiedzi

0 głosów
odpowiedź 23 kwietnia 2017 przez Michał Gibas Pasjonat (19,630 p.)

Po prostu daj mu jakiś offset na osi y np.

text.setPosition((sprite.getGlobalBounds().width-text.getGlobalBounds().width)/2+sprite.getGlobalBounds().left,
                     (sprite.getGlobalBounds().height-text.getGlobalBounds().height)/2+sprite.getGlobalBounds().top - 100);

Pozdrawiam!

komentarz 23 kwietnia 2017 przez Pajdas Mądrala (5,930 p.)
edycja 23 kwietnia 2017 przez Pajdas
tylko ten offset nie jest stały przy wszystkich wielkościach tekstu i przy wszystkich wielkościach przycisku, a to wszystko ma się ustawiać samo a nie na chybił-trafił

nawet coś w stylu "-textSize*0.3" to nie działa bo zależenie od wielkości tekstu ten mnożnik się zmienia

poza tym potrzebuję coś uniwersalnego, jakiś wzór, albo inne rozwiązanie problemu :)
komentarz 23 kwietnia 2017 przez Pajdas Mądrala (5,930 p.)
dobra już sobie poradziłem

na wielkość tekstu 50 trzeba offset ok. 14, więc z prostej proporcji wynika:

x = (textSize*14)/50;

poradziłem sobie sam, ale może mi ktoś wyjaśnić dlaczego tak się dzieje
0 głosów
odpowiedź 24 kwietnia 2017 przez maly Nałogowiec (37,190 p.)
sf::FloatRect rect = text.getLocalBounds();
text.setOrigin(rect.left + rect.width/2.f, rect.top + rect.height/2.f);

a potem ustaw pozycję tekstu na środek shape-a.

Podobne pytania

0 głosów
1 odpowiedź 313 wizyt
pytanie zadane 21 listopada 2015 w C i C++ przez katolik6 Dyskutant (8,140 p.)
0 głosów
0 odpowiedzi 133 wizyt
pytanie zadane 18 marca 2017 w HTML i CSS przez UltraSF Stary wyjadacz (11,740 p.)
0 głosów
3 odpowiedzi 413 wizyt
pytanie zadane 13 lutego 2023 w PHP przez zbiku25 Gaduła (3,000 p.)

92,839 zapytań

141,780 odpowiedzi

320,849 komentarzy

62,171 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...