[C++ SFML 2.X] Skalowalny przycisk z tekstem
Ostatnio zmodyfikowano 2024-10-06 19:14
tBane Temat założony przez niniejszego użytkownika |
[C++ SFML 2.X] Skalowalny przycisk z tekstem » 2024-10-06 17:47:47 Witam. Potrzebuję zaprogramować skalowalny przycisk z tekstem. Z góry uprzedzam, że wyśrodkowanie tekstu z użyciem sf::Text.getGlobalBounds().getSize() nie wchodzi w grę, gdyż tekst nie ma stałej wysokości dla danego rozmiaru czcionki. Potrzebuję zrobić taki przycisk gdzie jako argumenty podajemy tekst przycisku oraz pozycję (środek przycisku) i generuje nam obiekt. class Btn { public: sf::Vector2f position; sf::RectangleShape rect; sf::Sprite sprite; buttonState state; std::function < void() > func; sf::Time clickTime; Btn( float width = 64, float height = 64, sf::Vector2f position = sf::Vector2f( 0, 0 ) ) { this->position = position; rect = sf::RectangleShape( sf::Vector2f( width, height ) ); rect.setOrigin( width / 2, height / 2 ); rect.setPosition( position.x + cam->position.x, position.y + cam->position.y ); sprite = sf::Sprite(); state = buttonState::idle; func = { }; clickTime = currentTime; changeColor(); } };
class TextButton : public Btn { public: sf::Text text; TextButton( string text ) : Btn() { this->text = sf::Text(); this->text.setFont( basicFont ); this->text.setCharacterSize( 16 ); this->text.setFillColor( textColor ); this->text.setString( text ); sf::Vector2f textsize; textsize.x = this->text.getLocalBounds().getSize().x; textsize.y = this->text.getLocalBounds().getSize().y; this->text.setOrigin( textsize.x / 2, textsize.y / 2 ); this->text.setPosition( position.x + cam->position.x, position.y + cam->position.y ); rect.setSize( textsize ); rect.setOrigin( textsize.x / 2, textsize.y / 2 ); } virtual void setPosition( sf::Vector2f position ) { Btn::setPosition( position ); text.setPosition( position.x + cam->position.x, position.y + cam->position.y ); } virtual void update( float dt ) { Btn::update( dt ); } virtual void draw() { Btn::draw(); window->draw( text ); } };
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-10-06 19:14:22 Udało mi się wycentrować przycisk z tekstem class TextButton : public Btn { public: sf::Text text; TextButton( string txt ) : Btn() { this->text = sf::Text(); this->text.setFont( basicFont ); this->text.setCharacterSize( 16 ); this->text.setFillColor( textColor ); this->text.setString( txt ); generateText(); generateRect(); } void generateText() { sf::Vector2f textSize; textSize.x = text.getGlobalBounds().getSize().x; textSize.y = float( text.getCharacterSize() ) * 1.3f; text.setOrigin( textSize.x / 2, textSize.y / 2 ); text.setPosition( position.x + cam->position.x, position.y + cam->position.y ); } void generateRect() { sf::Vector2f rectSize; rectSize.x = float( text.getGlobalBounds().getSize().x ) + float( text.getCharacterSize() ) * 0.9f; rectSize.y = float( text.getCharacterSize() ) * 1.7f; rect.setSize( rectSize ); rect.setOrigin( rectSize.x / 2, rectSize.y / 2 ); rect.setPosition( position.x + cam->position.x, position.y + cam->position.y ); } virtual void setPosition( sf::Vector2f position ) { Btn::setPosition( position ); text.setPosition( position.x + cam->position.x, position.y + cam->position.y ); } void setCharacterSize( short characterSize ) { text.setCharacterSize( characterSize ); generateText(); generateRect(); } virtual void update( float dt ) { Btn::update( dt ); } virtual void draw() { Btn::draw(); window->draw( text ); } };
|
|
« 1 » |