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

SFML textbox, na jaką literę wskazuje kursor - szerokość tekstu.

Ostatnio zmodyfikowano 2017-08-30 20:54
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
SFML textbox, na jaką literę wskazuje kursor - szerokość tekstu.
» 2017-08-30 15:56:12
Witam.Chcę stworzyć textboxa, przy czym chciałbym, by dało się zaznaczać tekst. I kiedy mamy napis:

"napis" to można było wpisać coś pomiędzy p oraz i, itd. Oczywiście najpierw potrzebne jest zaznaczenie przez użytkownika, gdzie chce coś wpisać, czyli kliknięcie między dwie litery. Mam następujący problem: umiem sprawdzić długość danego sf::Text, ale jak sprawdzić, gdzie wskazuje kursor? Wiadomo, że 'M' jest szersze od 'i' (przynajmniej w większości czcionek), w dodatku występują przerwy między znakami (?), także jak określić, na jakie litery w tekście wskazuje kursor? Nie ma funkcji typu: getGlobalBounds(int IndexPierwszegoZnaku, int IndeksOstatniegoZnaku)?
P-164394
michal11
» 2017-08-30 16:08:36
Jeżeli chcesz to tylko wykorzystać to zobacz sobie tgui lub sfgui, jeżeli chcesz to napisać dla siebie (np. do nauki) to spójrz sobie w source tych bibliotek.
P-164395
pekfos
» 2017-08-30 16:25:25
Skoro umiesz sprawdzić długość tekstu, to sprawdzaj ile tekstu można wcisnąć przed kursor.
P-164396
1aam2am1
» 2017-08-30 17:13:37
sf::Font ma funkcje do sprawdzania szerokości litery dla danej wielkości czcionki. Oraz funkcje sprawdzającą odstęp pomiędzy literami.
sf::Font::getGlyph
sf::Font::getKerning
P-164399
DejaVu
» 2017-08-30 17:30:41
To ja dorzucę, aby było trudniej :D Szerokość czionki będzie ulegała zmianie w zależności od zastosowanego zooma na scenie (jeżeli będziesz chciał zachować ostrość czcionki wraz z zoomowaniem) :)
P-164402
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-08-30 19:37:34
@pekfos
Skoro umiesz sprawdzić długość tekstu, to sprawdzaj ile tekstu można wcisnąć przed kursor.
Mogę sprawdzić szerokość całego obiektu sf::Text, a nie fragmentu, np. 10 liter.

@DejaVu
przeżyję bez tego ;)

@1aam2am1
Widziałem te metody, ale czy to nie będzie za długo trwało? Sprawdzanie litera po literze, odstęp po odstępie?

Myślałem też o tym, by wrzucać część tekstu do innego obiektu sf::Text i tam badać jego długość, ale nie wiem z kolei, czy to będzie faktyczna długość tekstu, w sensie czy sf::Text nie dodaje sobie jakiś marginesów itp.

P-164411
pekfos
» 2017-08-30 19:46:36
Widziałem te metody, ale czy to nie będzie za długo trwało? Sprawdzanie litera po literze, odstęp po odstępie?
A co twoim zdaniem robi sf::Text, kiedy wrzucasz nowy napis?

czy to będzie faktyczna długość tekstu, w sensie czy sf::Text nie dodaje sobie jakiś marginesów itp.
Jak chcesz mieć dokładność co do pixela, to lepiej użyj font.getGlyph(..).advance w pętli zamiast bounding boxa z sf::Text.
C/C++
float adv = 0.f;
wchar_t last = 0;
for( auto wc: _str )
{
    adv += ref_font.getGlyph( wc, fontSize, bold ).advance;
    adv += ref_font.getKerning( last, wc, fontSize );
    last = wc;
}
return adv;
P-164414
1aam2am1
» 2017-08-30 20:54:32
Stwierdzam że metoda z funkcjami jest dużo szybsza niż wrzucanie do sf::Text fragmentu.
Zrobiłem na tych funkcjach zawijanie linii :)
I nie będzie to dużo trwało. Jeżeli dobrze to zrobisz.
P-164424
« 1 »
  Strona 1 z 1