Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Jak sprawdzić rozmiary Textu

Ostatnio zmodyfikowano 2015-08-14 14:54
Autor Wiadomość
marc_xxx
Temat założony przez niniejszego użytkownika
[SFML] Jak sprawdzić rozmiary Textu
» 2015-06-29 21:17:33
Witam.
Jak sprawdzić rozmiary textu w pikselach? Utworzyłem sobie w sfmlu jakiś napis, który wyświetla się na ekranie - ba być to przycisk. Chcę dodać teraz jakieś tło do przycisku - jakiś prostokąt (za pomocą klasy RectangleShape). I tu pojawia się problem, otóż chcę stworzyć to tło dokładnie takie w takich samych rozmiarach jak text lecz klasa Text nie ma funkcji getSize() (pomimo iż dziedziczy po klasie Transformable). Jak sprawdzić rozmiary tego Textu?
P-134171
Glazus
» 2015-06-29 22:44:09
Przy pomocy
getGlobalBounds()
.
P-134173
marc_xxx
Temat założony przez niniejszego użytkownika
» 2015-06-30 00:00:42
Robiłem już tak wcześniej. Nie działa jak należy. Chyba, że zrobiłbyś to w inny sposób. U mnie te tła przycisków są za małe, mniejsze niż rozmiary tekstu. Kod:
C/C++
Button::Button( string buttonName )
{
    sf::FloatRect textBox;
    double width, height;
   
    this->buttonText.setFont( buttonFont );
    this->buttonText.setPosition( 150, nextButtonPosition );
    this->buttonText.setString( buttonName );
    this->buttonText.setCharacterSize( 50 );
    this->buttonText.setColor( sf::Color::Black );
   
    textBox = this->buttonText.getGlobalBounds();
    width = textBox.width;
    height = textBox.height;
   
    this->buttonBackground.setSize( sf::Vector2f( width, height ) );
    this->buttonBackground.setFillColor( sf::Color( 204, 220, 255 ) );
    this->buttonBackground.setPosition( 150, nextButtonPosition );
   
    nextButtonPosition += 60;
}
P-134174
Glazus
» 2015-06-30 09:03:00
Bo tło nie ma być tych samych wymiarów, które pobierasz za pomocą
getGlobalBounds()
, tylko nieco większe.
Spróbuj coś takiego:
C/C++
width = textBox.width + 20;
height = textBox.height + 10;
P-134178
Gibas11
» 2015-08-14 14:54:22
Ja tam dla świętego spokoju napisałem własną klasę dla przycisków, wprawdzie wymusza wczytanie przycisków z pliku i nie ma żadnego ułatwienia jeżeli chodzi o obsługę wielu przycisków, więc każdym musisz się zająć z osobna ale u mnie się sprawdziła:
C/C++
#ifndef BUTTON_H_INCLUDED
#define BUTTON_H_INCLUDED

namespace sf
{
    namespace gui
    {
        class Button
            : public sf::Drawable
        {
        public:
            Button( sf::Vector2f Coords, sf::Texture texture1, sf::Texture texture2 );
           
            void destroy();
            void update( Event event );
            void update();
            void setPosition( sf::Vector2f Coords );
            void setPosition( double x, double y );
            sf::Vector2f coords;
            sf::Sprite sprite;
            bool funcDone = false;
           
        private:
            virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const;
           
            sf::Vector2f mouseCoords;
            sf::Texture texture;
            sf::Texture Texture1;
            sf::Texture Texture2;
            bool toDelete = false;
            int state;
        };
       
        Button::Button( sf::Vector2f Coords, sf::Texture texture1, sf::Texture texture2 )
        {
            coords = Coords;
            state = 0;
           
            Texture1 = texture1;
            Texture2 = texture2;
        }
       
        void Button::update( Event event )
        {
            if( event.type == sf::Event::MouseMoved )
            {
                mouseCoords = sf::Vector2f( event.mouseMove.x, event.mouseMove.y );
               
                if( sprite.getGlobalBounds().contains( mouseCoords ) )
                     state = 1;
                else
                     state = 0;
               
            }
            if( event.type == sf::Event::MouseButtonPressed and state == 1 )
            {
                funcDone = true;
            }
           
            if( state == 0 )
                 sprite.setTexture( Texture1 );
            else if( state == 1 )
                 sprite.setTexture( Texture2 );
           
            sprite.setPosition( coords );
        }
       
        void Button::update()
        {
            mouseCoords = sf::Vector2f( sf::Mouse::getPosition( app ).x, sf::Mouse::getPosition( app ).x );
           
            if( sprite.getGlobalBounds().contains( mouseCoords ) )
                 state = 1;
            else
                 state = 0;
           
            if( state == 0 )
                 sprite.setTexture( Texture1 );
           
            else if( state == 1 )
                 sprite.setTexture( Texture2 );
           
            sprite.setPosition( coords );
        }
       
        void Button::destroy()
        {
            toDelete = true;
        }
       
        void Button::setPosition( sf::Vector2f Coords )
        {
            coords = Coords;
        }
       
        void Button::setPosition( double x, double y )
        {
            coords = sf::Vector2f( x, y );
        }
       
        void Button::draw( sf::RenderTarget & target, sf::RenderStates states ) const
        {
            target.draw( sprite, states );
        }
    };
};

#endif // BUTTON_H_INCLUDED

To teraz mały poradniczek do obsługi:
1.) Wrzuć mój kod do jakiegoś pliku nagłówkowego zaraz po plikach SFML.
2.) Kod do utworzenia prostego przycisku i zajęcia się jego obsługą:
C/C++
sf::Texture playButton[ 2 ]; //Tablica na tekstury przycisku
playButton[ 0 ].loadFromFile( "assets/graphics/UI/mainMenu/play1.png" ); //Tekstura 1. wyświetlana gdy kursor jest gdzieś nie nad przyciskiem
playButton[ 1 ].loadFromFile( "assets/graphics/UI/mainMenu/play2.png" ); //Tekstura 2. wyświetlana gdy najedziemy kursorem na przycisk (nic nie stoi na przeszkodzie by była to ta sama tekstura)

sf::gui::Button PlayButton( sf::Vector2f( 0, 0 ), playButton[ 0 ], playButton[ 1 ] ); //Tworzymy przycisk, argumenty to kolejno: Współrzędne, pierwsza tekstura, druga tekstura
//Jeżeli chcesz ustawić skalę, ponieważ przycisk jest za mały / za duży użyj tego: PlayButton.sprite.scale(7, 7);

for(;; ) //jakaś tam pętla, żeby wszystko było stale aktualizowane a nie wykonane jednokrotnie
{
    while( app.pollEvent( event ) ) //Pętla obsługi zdarzeń
    {
        PlayButton.update( event ); //Aktualizacja przycisku
        if( PlayButton.funcDone )
        {
            //Jakiś tam kod do wykonania po naciśnięciu przycisku
            PlayButton.funcDone = false;
        }
    }
    app.draw( PlayButton ); //app podmień ze swoim oknem
   
}

Pozycję przycisku możesz ustawić też przez najprostsze "PlayButton.setPosistion(x, y);"
EDIT: funkcja destroy() nie robi w zasadzie niczego, ustawia tylko toDelete na true, jeżeli potrzebujesz usuwania przycisków musisz je sobie sam zaimplementować. I jeszcze jedno, może cię ciekawić druga funkcja update nie przyjmująca zdarzenia, jej zastosowania są raczej specyficzne i u mnie była potrzebna do odznaczenia przycisku podczas przechodzenia do podmenu.
Ps. A propos podmenu, jeżeli będziesz potrzebował prostej przyciskowej weryfikacji (Yes / No), mogę podrzucić też jej kod.
P-136235
« 1 »
  Strona 1 z 1