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

[C++ SFML 2.X] Skalowalny przycisk z tekstem

Ostatnio zmodyfikowano 2024-10-06 19:14
Autor Wiadomość
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.

C/C++
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();
   
}
}
;


C/C++
class TextButton
    : public Btn
{
public:
   
sf::Text text;
   
   
//std::vector < Option > options;
   
   
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; // nie równa wysokość dla różnych napisów o tej samej wielkości znaków
       
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 );
   
}
}
;
P-181678
tBane
Temat założony przez niniejszego użytkownika
» 2024-10-06 19:14:22
Udało mi się wycentrować przycisk z tekstem
C/C++
class TextButton
    : public Btn
{
public:
   
sf::Text text;
   
   
//std::vector < Option > options;
   
   
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 );
   
}
}
;
P-181679
« 1 »
  Strona 1 z 1