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

[SFML2] Dopasowanie stringa do okienka

Ostatnio zmodyfikowano 2016-01-09 21:40
Autor Wiadomość
qest43
Temat założony przez niniejszego użytkownika
[SFML2] Dopasowanie stringa do okienka
» 2016-01-09 20:38:42
Jeżeli wczytuję sobie jakiś tekst do stringa, i potem chcę go wyświetlić na ekranie, w np. prostokącie z sfmla w ten sposób, jeżeli tekst jest za długi to przechodzi do następnej linijki aby nie wychodził poza obszar. Jak to zrobić?
P-143214
Gibas11
» 2016-01-09 20:48:55
O ile się nie mylę sf::Text nie obsługuje przejść do następnej linii, więc prawdopodobnie musiałbyś zrobić 1 obiekt klasy sf::Text na linijkę i dynamicznie przerzucać kawałki tekstu po przekroczeniu jakiejś tam granicy. Do sprawnego wykrywania wyjścia poza jakiś obszar może Ci się przydać to: http://www.sfml-dev.org​/documentation/2.0​/classsf_1_1Text.php#adf120ed4159e43daa782b17fea23ea82
P-143216
1aam2am1
» 2016-01-09 21:40:39
Fragment mojego programu napisanego nie wiadomo kiedy.
C/C++
std::string tym = "To jest tekst który ma nie wystawać za okno";
std::string tym1;
int32_t space = - 1;
/** zbyt dlugo to trwa */
for( uint32_t i = 0; i < tym.size(); )
{
    text.setString( tym1 );
    if( text.getGlobalBounds().width < 633 ) ///633 to moja maksymalna długość okna
    {
        tym1 += tym[ i ];
        if( tym[ i ] == ' ' ) { space = i; }
        if( tym[ i ] == '\n' )
        {
            tym1.pop_back(); //usuwam enter
            tym.erase( 0, i + 1 ); //usuwam wczesniejsze dane
            this->message.push_back( tym1 );
            tym1.clear();
            space = - 1;
            if( tym.empty() ) { this->message.push_back( "" ); }
           
            i = 0;
            continue;
        }
    }
    else
    {
        if( space == - 1 )
        {
            tym1.pop_back(); //usuwam niemieszczacy sie znak
            tym.erase( 0, i + 1 ); //usuwam wczesniejsze
            this->message.push_back( tym1 );
            tym1.clear();
           
            i = 0;
            continue;
        }
        else
        {
            tym1.clear();
            tym1.insert( 0, tym, 0, space );
            tym.erase( 0, space + 1 ); //popraw
            this->message.push_back( tym1 );
            tym1.clear();
            space = - 1;
           
            i = 0;
            continue;
        }
    }
   
    ++i;
}

if( !tym1.empty() )
{
    this->message.push_back( tym1 );
}
message - to kontener
text - sf::Text z ustalonym fontem i wielkością itd...

Na końcu wyświetlam kolejne linie message. To chyba umiesz.




TGUI - fragment poniżej - nie mój algorytm
C/C++
std::string text = "To jest tekst który ma nie wystawać za okno";

unsigned int pos = 0;
unsigned int size = 0;
while( pos + size < text.getSize() )
{
    tempLine->setText( text.substring( pos, ++size ) );
   
    if( tempLine->getGlobalBounds().width + 4.0f > width )
    {
        label->setText( label->getText() + text.substring( pos, size - 1 ) + "\n" );
       
        pos = pos + size - 1;
        size = 0;
    }
}
label->setText( label->getText() + tempLine->getText() );
tempLine i label to sf::Text
P-143220
« 1 »
  Strona 1 z 1