• 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
434 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,610 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ź 292 wizyt
pytanie zadane 21 listopada 2015 w C i C++ przez katolik6 Dyskutant (8,140 p.)
0 głosów
0 odpowiedzi 120 wizyt
pytanie zadane 18 marca 2017 w HTML i CSS przez UltraSF Stary wyjadacz (11,740 p.)
0 głosów
3 odpowiedzi 329 wizyt
pytanie zadane 13 lutego 2023 w PHP przez zbiku25 Bywalec (2,940 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...