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

SMFL 2.1 GUI Tworzenie klasy przycisków problem z umieszczeniem tekstu na środku przycisku.

Ostatnio zmodyfikowano 2014-10-03 23:44
Autor Wiadomość
Xanes
Temat założony przez niniejszego użytkownika
» 2014-10-01 20:46:21
Deklaracja Klasy:

C/C++
#pragma once
#include <SFML/Graphics.hpp>
#include <iostream>
class Button
{
    float posX, posY;
    sf::Font font;
    sf::Event event;
    sf::RectangleShape body;
    sf::Text text;
    sf::Vector2i posMouse;
   
public:
    Button( void );
    Button::Button( const sf::String & ButtonText, sf::Color TextColor, const float posX, const float posY );
   
};

Definicja:

C/C++
#include "Button.h"

Button::Button( void )
{
    this->posX = 50;
    this->posY = 50;
    font.loadFromFile( "arial.ttf" ); //ładowanie czcionki
    text.setCharacterSize( 60 ); //rozmiar czcionki
    text.setFont( font );
    text.setString( "BUTTON" );
    body.setSize( sf::Vector2f((( text.getGlobalBounds().width ) + 20 ),( text.getGlobalBounds().height ) + 10 ) );
    body.setOutlineThickness( 5 );
    body.setOutlineColor( sf::Color::White );
    body.setFillColor( sf::Color::Black );
    body.setPosition( posX, posY );
    text.setColor( sf::Color::White );
    text.setPosition( posX + 8.5, posY - 10 );
}

Button::Button( const sf::String & ButtonText, sf::Color TextColor, const float posX, const float posY )
{
    font.loadFromFile( "arial.ttf" );
    text.setCharacterSize( 60 );
    text.setFont( font );
    text.setString( ButtonText );
    body.setSize( sf::Vector2f((( text.getGlobalBounds().width ) + 20,( text.getGlobalBounds().height ) + 10 ) );
    body.setOutlineThickness( 5 );
    body.setOutlineColor( sf::Color::White );
    body.setFillColor( sf::Color::Black );
    body.setPosition( posX, posY );
    text.setColor( TextColor );
    text.setOrigin( text.getGlobalBounds().width / 2, text.getGlobalBounds().height / 2 ); <---linijki dodane
    text.setPosition( posX + body.getGlobalBounds().width / 2, posY + body.getGlobalBounds().height / 2 ); <---linijki dodane
    this->posX = posX;
    this->posY = posY;
   
}

screen:
http://ifotos.pl/zobacz/zdjciejpg_eqepswa.jpg/


obiekt tworzymy tak:
Button start("START",sf::Color::Red,160,280);
P-117833
colorgreen19
» 2014-10-01 21:44:45
text.setPosition( posX + body.getSize().x / 2 - text.getGlobalBounds().width / 2, posY + body.getSize().y / 2 - text.getGlobalBounds().height / 2 )
 spróbuj tak
P-117838
sajmon
» 2014-10-01 22:05:45
Mi się wydaję, że walisz za dużą czcionkę i ona ma jeszcze marginesy i dlatego jest przesunięta tak dziwnie.
Próbowałeś mniejszy rozmiar ?
P-117839
Glazus
» 2014-10-01 23:41:14
Hm...

A takie rozwiązanie naprawia problem?

text.setPosition( posX +( body.getGlobalBounds().width - 20 ) / 2, posY +( body.getGlobalBounds().height - 10 ) / 2 );
P-117844
maly
» 2014-10-02 09:13:19
W sf::Text do prawidłowego ustawienia wycentrowanego origin trzeba brać pod uwagę left i top które nie są w punkcie 0,0.
C/C++
sf::FloatRect rect = text.getLocalBounds();
text.setOrigin( rect.left + rect.width / 2.f, rect.top + rect.height / 2.f );
P-117845
CodeMeister
» 2014-10-02 23:25:05
Sam rowniez spotkalem sie z tym problemem, jutro podrzuce kod z rozwiazaniem. Do Y dodaje lub odejmuje sie bodajze characterSize * 0.25

Nie pamietam dokladnie, jak pisalem jutro moge podac rozwiazanie :)
P-117859
Xanes
Temat założony przez niniejszego użytkownika
» 2014-10-03 19:12:25
"colorgreen19" Próbowałem tego sposobu zanim pisałem na forum, nie daje rozwiązania mojego problemu.
"sajmon" Poczytaj co na początku pisałem. Ja chce aby można było podać każdy rozmiar czcionki od najmniejszej do największej.
"Glazus" Niestety myślałem na początku aby tak zrobić ale to też nie jest rozwiązanie mojego problemu.
"maly"  Dokładnie tak twój sposób okazał się rozwiązaniem dla wszystkich przypadków. :) WIELKIE DZIĘKI !!!


Oto rozwiązanie problemu:

text.setOrigin( text.getGlobalBounds().left+text.getGlobalBounds().width / 2, text.getGlobalBounds().top+text.getGlobalBounds().height / 2 );
text.setPosition( (posX + body.getGlobalBounds().width / 2)-OutlineThicknessValue, (posY + body.getGlobalBounds().height / 2)-OutlineThicknessValue);

OutlineThicknessValue to parametr dla funkcji body.setOutlineThickness(OutlineThicknessValue); który trzeba odjąć aby tekst był idealnie na środku jeśli się go ustawia.



"maly" mam do ciebie jeszcze jedno pytanie nie zabardzo rozumiem o co chodzi z tą funkcją setOrigin i co to są te parametry Left oraz top w obiekcie InRect ?


Wydaje mi się że to pytanie również podpina się pod ten temat ponieważ pozwoli zrozumieć lepiej zaistniały problem.
P-117884
maly
» 2014-10-03 19:34:14
Left to pozycja x a Top to pozycja y w sf::Rect< T >
P-117886
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona