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

[SFML] Problem z wycentrowaniem

Object Storage Arubacloud
0 głosów
469 wizyt
pytanie zadane 4 stycznia 2016 w C i C++ przez emSon Stary wyjadacz (10,480 p.)

Siemanko. Mam IMO dziwny problem, który nie daje mi spać.

Nagłówek (Snake) i opcje (Play i Exit) korzystają z praktycznie tej samej funkcji ustawiającej napis na właściwym miejscu, tylko że druga bierze pod uwagę jeszcze która to jest opcja z kolei. Chociaż przy ustawianiu opcji funkcją dla nagłówka efekt był podobny. Bez zbędngo gadania - potrzebny kod:

 

void View::setBestTextPosition(sf::Text &header)
{
    sf::Vector2f vector2f;

    vector2f.x = Data::Main_windowWidth/2-header.getGlobalBounds().width/2;
    vector2f.y = Data::View_headerTopMargin;

    header.setPosition(vector2f);
}
void View::setBestTextPosition(int number, sf::Text &option)
{
    sf::Vector2f vector2f;

    vector2f.x = Data::Main_windowWidth/2-option.getGlobalBounds().width/2;
    vector2f.y = (number+1)*Data::View_optionTopMargin+2*Data::View_headerTopMargin;

    option.setPosition(vector2f);
}

Co ciekawe, linijka z funkcji z dwoma argumentami:

vector2f.x = Data::Main_windowWidth/2-option.getGlobalBounds().width/2;

działa tak samo jak:

vector2f.x = Data::Main_windowWidth/2;

Podejrzewam, że z jakiegoś nieznanego mi powodu nie może pobrać odpowiedniej pozycji opcji.

2 odpowiedzi

0 głosów
odpowiedź 4 stycznia 2016 przez arek01996 Stary wyjadacz (12,100 p.)
Zamień napis Exit na jakiś dłuższy np Arkadiusz i daj screen co się stanie.
komentarz 4 stycznia 2016 przez emSon Stary wyjadacz (10,480 p.)

Napis: Ildonsy "Iwan" Galczynski.

komentarz 4 stycznia 2016 przez arek01996 Stary wyjadacz (12,100 p.)

Spróbuj wyświetlić wartość

option.getGlobalBounds().width/2;

w konsoli

np

void View::setBestTextPosition(int number, sf::Text &option)
{
    sf::Vector2f vector2f;
 
    vector2f.x = Data::Main_windowWidth/2-option.getGlobalBounds().width/2;
    vector2f.y = (number+1)*Data::View_optionTopMargin+2*Data::View_headerTopMargin;
    
    std::cout << option.getGlobalBounds().width/2 << std::endl;

    option.setPosition(vector2f);
}

 

komentarz 4 stycznia 2016 przez niezalogowany

Definitywnie przyczepia lewą część tekstu do linii przez którą przechodzi środek ekranu. Kod wydaje się dobry, spróbuj zrobić to przez brute-force, czyli:

vector2f.x = Data::Main_windowWidth/2-option.getGlobalBounds().width;

 

komentarz 4 stycznia 2016 przez emSon Stary wyjadacz (10,480 p.)

Niestety Szymon, twój kod nie pomógł.

Dla kodu:

void View::setBestTextPosition(int number, sf::Text &option)
{
    sf::Vector2f vector2f;

    vector2f.x = Data::Main_windowWidth/2-option.getGlobalBounds().width;
    vector2f.y = (number+1)*Data::View_optionTopMargin+2*Data::View_headerTopMargin;
    cout << option.getGlobalBounds().width << endl;
    option.setPosition(vector2f);
}

Konsola wypisuje:

0

0

 

komentarz 4 stycznia 2016 przez niezalogowany
W takim razie nic dziwnego że żaden kod nie działa skoro szerokość drugiego obiektu to 0, coś źle działa getGlobalBounds, bo nie powinno zwracać 0.
komentarz 4 stycznia 2016 przez emSon Stary wyjadacz (10,480 p.)
Że nie powinno to raczej wiem. Opcje wcześniej się ustawiały prawidłowo, tylko że zrobiłem dodatkową klasę po której menu dziedziczy. Dodam, że inny obiekt tej klasy także ma problem z centrowaniem opcji.

Spotkałeś się kiedyś z takim problemem?
komentarz 4 stycznia 2016 przez niezalogowany
Nie, jeżeli bym się spotkał to napisałbym wcześniej. Ten problem to dla mnie nowość.
komentarz 4 stycznia 2016 przez arek01996 Stary wyjadacz (12,100 p.)
Podaj cały kod zlokalizuje błąd.
komentarz 5 stycznia 2016 przez emSon Stary wyjadacz (10,480 p.)
0 głosów
odpowiedź 6 stycznia 2016 przez maly Nałogowiec (37,190 p.)

Przy wyliczaniu środka dla sf::Text trzeba brać pod uwagę nie tylko width i height ale też left i top.

sf::FloatRect bounds = text.getLocalBounds();
sf::Vector2f center(bounds.left + bounds.width/2.f, bounds.top + bounds.height/2.f);

 

Podobne pytania

0 głosów
1 odpowiedź 301 wizyt
0 głosów
1 odpowiedź 114 wizyt
pytanie zadane 1 stycznia 2022 w HTML i CSS przez Codi Początkujący (340 p.)
+1 głos
1 odpowiedź 279 wizyt
pytanie zadane 16 sierpnia 2021 w HTML i CSS przez TomaszR Nowicjusz (170 p.)

92,761 zapytań

141,685 odpowiedzi

320,485 komentarzy

62,105 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!

...