[SFML] Jak sprawdzić rozmiary Textu
Ostatnio zmodyfikowano 2015-08-14 14:54
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? |
|
Glazus |
» 2015-06-29 22:44:09 Przy pomocy getGlobalBounds() . |
|
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: 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; }
|
|
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: width = textBox.width + 20; height = textBox.height + 10; |
|
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: #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
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ą: sf::Texture playButton[ 2 ]; playButton[ 0 ].loadFromFile( "assets/graphics/UI/mainMenu/play1.png" ); playButton[ 1 ].loadFromFile( "assets/graphics/UI/mainMenu/play2.png" );
sf::gui::Button PlayButton( sf::Vector2f( 0, 0 ), playButton[ 0 ], playButton[ 1 ] );
for(;; ) { while( app.pollEvent( event ) ) { PlayButton.update( event ); if( PlayButton.funcDone ) { PlayButton.funcDone = false; } } app.draw( PlayButton ); }
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. |
|
« 1 » |