sajmon Temat założony przez niniejszego użytkownika |
[SFML 2.0] ograniczony rozmiarami text input, rozmiar konkretnych znaków » 2013-04-15 17:48:32 Siemka. Robię sobie takie prymitywne gui i zastanawiam się na textinputem. Mam zrobione już, że po wprowadzeniu tekstu dłuższego niż szerokość kontrolki tekst się przycina itp. tylko głowię się nad dokładną szerokością tekstu. sf::Text::getLocalBounds() dla czcionki o rozmiarze 15 zwraca średnio 2 razy większe wartości. I np po podzieleniu przez 2 szerokość niektórych znaków się zgadza, ale niektóre są mniejsze nawet o 4 piksele a niektóre troszkę większe od wyniku dzielenia :C To powoduje, że zależnie od tego jakie znaki się wprowadzi albo widoczny string jest krótszy albo dłuższy od kontrolki :/ I teraz mam pytanie czy jest jakiś lepszy sposób na sprawdzenie szerokości konkretnego znaku :( ? Bo jedyne rozwiązanie jakie mi przychodzi do głowy to zdeklarować jakąś mapę szerokości dla każdego znaku, ale to rozwiązanie zdaje się dosyć toporne oraz czasochłonne będzie taką mapę zbudować bo bd musiał każdy znak z osobna "mierzyć" w gimpie :C
Ktoś ma jakieś lepsze pomysły :) ? |
|
pekfos |
» 2013-04-15 17:59:08 Tymczasem kilka linii niżej w dokumentacji..sf::Text::getGlobalBounds()
|
|
sajmon Temat założony przez niniejszego użytkownika |
» 2013-04-15 18:04:32 no pewnie że to sprawdzałem zanim napisałem xd zwraca to samo co sf::Text::getLocalBounds() przynajmniej w moim przypadku :C |
|
pekfos |
» 2013-04-15 18:07:02 Kod? |
|
sajmon Temat założony przez niniejszego użytkownika |
» 2013-04-15 18:13:19 tak na dziko pisane narazie :P w addletter jest dodawany tylko 1 znak na raz class pTextEdit : public pWidget { public: pTextEdit(); pTextEdit( float, float, float, float ); bool isActive; void updateShape(); void addLetter( sf::String & ); void removeLetter(); sf::Text textEditText; sf::Text prepareText(); sf::String textEditString; sf::String textEditCutString; float textWidth; private: virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const; };
void pTextEdit::addLetter( sf::String & s ) { sf::Text t( s ); std::cout << "Dodanie literki, " << t.getLocalBounds().width << "(" << t.getGlobalBounds().width << ") :" <<( float )( int )( t.getLocalBounds().width / 2.f ) + 1 << std::endl; this->textWidth +=(( float )( int )( t.getLocalBounds().width / 2.f ) + 1 ); this->textEditString += s; this->textEditCutString += s; this->prepareText(); }
void pTextEdit::removeLetter() { if( this->textEditCutString.getSize() > 0 ) { sf::String tmp = this->textEditCutString; sf::String tmpforsize = this->textEditCutString; if( this->textEditString.getSize() > this->textEditCutString.getSize() ) { size_t lnumber = tmp.getSize(); tmp.erase( tmp.getSize() - 1, 1 ); tmpforsize.erase( 0, tmpforsize.getSize() - 1 ); sf::Text tmpT( tmpforsize ); this->textWidth -=(( float )( int )( tmpT.getLocalBounds().width / 2.f ) + 1 ); sf::String tmp2 = this->textEditString; tmp2.erase( tmp2.getSize() - lnumber, lnumber ); tmp2.erase( 0, tmp2.getSize() - 1 ); sf::Text tmpT2( tmp2 ); this->textWidth +=(( float )( int )( tmpT2.getLocalBounds().width / 2.f ) + 1 ); tmp.insert( 0, tmp2 ); } else { tmp.erase( tmp.getSize() - 1, 1 ); tmpforsize.erase( 0, tmpforsize.getSize() - 1 ); sf::Text tmpT( tmpforsize ); this->textWidth -=(( float )( int )( tmpT.getLocalBounds().width / 2.f ) + 1 ); } this->textEditString.erase( this->textEditString.getSize() - 1, 1 ); this->textEditCutString = tmp; this->prepareText(); } }
sf::Text pTextEdit::prepareText() { while(( this->textWidth ) >( this->widgetSize.x - 10 ) ) { sf::String tmp = this->textEditCutString; tmp.erase( 1, tmp.getSize() - 1 ); sf::Text tmpT( tmp ); this->textEditCutString.erase( 0, 1 ); this->textWidth -=(( float )( int )( tmpT.getLocalBounds().width / 2.f ) + 1 ); } this->textEditText.setString( this->textEditCutString ); this->textEditText.setPosition( this->widgetPosition.x + 5, this->widgetPosition.y +( this->widgetSize.y - this->textEditText.getLocalBounds().height ) / 2 ); std::cout << "Wielkość tekstu: " << this->textWidth << std::endl; return this->textEditText; } |
|
pekfos |
» 2013-04-15 18:21:30 sf::Text t( s ); std::cout << "Dodanie literki, " << t.getLocalBounds().width << "(" << t.getGlobalBounds().width << ") :" <<( float )( int )( t.getLocalBounds().width / 2.f ) + 1 << std::endl; getGlobalBounds uwzględnia przekształcenia. Są tu przekształcenia? Jeśli skalujesz tekst tylko przed wyświetleniem, to się nie dziw, że wszędzie indziej tekst ma domyślny rozmiar. |
|
sajmon Temat założony przez niniejszego użytkownika |
» 2013-04-15 22:43:38 o jaaa no racja ale nie ogarnąłem :P dodałem to tych tymczasowych obiektów tekstowych zmianę czcionki zmieniłem tę metodę z local na global, ale i tak wartości są identyczne jak wtedy jak dzieliłem je na 2 (czcionke ustawiam 15) i na przykład "A" mierzone w gimpie ma 9 pikseli szerokości a metoda getGlobalBounds() wyrzuca 13 px, a taka kropka ma 4px a ta metoda daje 3 px. I te różnice właśnie tworzą te przesunięcia :/ Jest na to jakiś sposób ? |
|
DejaVu |
» 2013-06-28 17:43:57 Musisz poświęcić trochę czasu na zapoznanie się z przekształceniami współrzędnych pomiędzy sceną, a ekraniem bądź oknem aplikacji. Metody do ustalania rozmiaru tekstu już zostały podane, tj. sf::Text::getLocalBounds() oraz sf::Text::getGlobalBounds(). Temat można więc uznać za rozwiązany i zakończony. Jeeżeli masz potrzebę wznowienia dyskusji na temat przekształceń to załóż osobny temat :) Ten temat zamykam. |
|
« 1 » |