Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Text width a length
#1
Siema, potrzebuję pomocy Smile

Spoko, opanowałem w jaki sposób dzięki: slice i text.len() urwać długość tekstu i pozostały tekst wykorzystać gdzie indziej.

Jak np: Zrobić draw1. Ale jeśli długość tekstu przekroczy pewną wartość to nadać draw1 tekst do pewnego momentu i nadać resztę tekstu dla draw2.

Teraz jest jednak problem, mianowicie: Width oraz WidthPx będą różne w zależności od tego jakie znaki są w tekście, oraz wielkości tych znaków, więc przekreśliłem próbę przeliczania wyników uzyskanych z width a len.

Ogólnie chodzi mi o to że nie mam pomysłu jak porównując szerokość tekstu z szerokością tekstury urwać ten text w odpowiedniej szerokości i wyjąć resztę tekstu.


Gdybym wciąż napisał to wszystko niezrozumiale:

Chodzi mi o ucięcie tekstu jeśli przekroczy daną szerokość lub szerokość w pixelach i wyciągniecie reszty tekstu, lub przelicznik długości na szerokość.
Reply
#2
textWidth(string text)
textWidthPx(string text)
letterWidth(char letter)
letterWidthPx(char letter)
letterDistance()
letterDistancePx()

Około 99% tego co napisałeś jest niezrozumiałe więc strzelam, że chodziło Ci o to...
Reply
#3
Nie. Chodzi mi o coś w tym stylu, nie patrz na jakość skryptu bo ja tak testuje a gdy mam wszystko git to usprawniam.
Code:
local drawTable={};
function test(x,y,text){
drawTable[0]<-Draw(x, y, text);
drawTable[1]<-Draw(x, y+400, "");
drawTable[2]<-Draw(x, y+800, "");
if(text.len()>=50){
drawTable[0].text=text.slice(0, 50);
drawTable[1].text=text.slice(50, text.len());
}
foreach (draw in drawTable)
draw.visible=true;
}




No i ten prymitywny kawałek kodu działa, sam dobrze wiesz w jaki sposób, że jesli tekst bedzie zawierał wiecej znaków niż 50 to draw[0] zaktualizuję tekst o te 50 znaków a draw[1] zaktualizuje tekst o pozostałe literki


A mi chodzi o to samo ale nie jeśli ma ileś znaków, a jeśli przekroczy width. A właściwie o to że pytam jak podać serwerowi że w tej szerokości tekstu ma go uciąć o tyle i tyle znaków.
Reply
#4
Wyciągaj fragment tekstu litera po literze, wrzucaj go do tej funkcji textWidth(string text) i sprawdzaj długość.
Reply
#5
Albo lepiej wrzuć cały i odejmuj jeśli przekracza zakres Smile
Reply
#6
Ja mam dokładnie takie coś, co chcesz uzyskać zrobione:
Code:
local name_string = "tekst, który chcesz skrócić";
local max_width = b_size.w - 10;
local width = 0;
local chars_nr = name_string.len();
        
for(local j = 0; j < name_string.len(); j++)
{    
    width += textWidthPx(name_string.slice(j, j + 1));
    if (width > max_width)
    {
        chars_nr = j;
        j = name_string.len();
    }    
}
button_drw[id].text = name_string.slice(0, chars_nr);

b_size.w - 10 to szerokość tekstury minus margines
chars_nr to wynik w postaci ilości znaków, które się zmieszczą
Wilk Morski Klanu Espadre
Reply
#7
Ok, dzięki wszystkim, prosiłbym o albo zamknięcie tematu, albo zmianę jego nazwy na coś w stylu "Prośby o pomoc SonGoku" hehe.
Reply
#8
Hejo. Ok skrypt Zmorry pomógł mi dość solidnie, teraz jednak oczywiście musiał pojawić się kolejny problem. Mianowicie pracuję nad systemem dialogów identycznym jak w G2. osiągnąłem już takie coś: http://imgur.com/a/9PbKC Jednak w orginale w dialogach tekst przechodzi do nowej linii od słowa do słowa.

Jak widać na screenie urywa słowo w pewnym momencie i przechodzi do nowej linii. zastanawiam się jak to zniwelować, próbowałem coś kombinować z split i z string.find, ale nie bardzo mi to idzie, nie wiem nawet czy to dobry trop bo tak czy inaczej muszę to jakoś wmieszać w skrypt od Zmorry, macie jakieś pomysły, chce wam się pomóc?
Reply
#9
Jak używasz na sztywno sprawdzania czy linia sie mieści w teksturze to są potem takie niuanse. Powinieneś iterować przez litery i w momencie kiedy znajdziesz spacje, sprawdzasz długość tekstu. Jeśli się mieści w linii to iterujesz dalej, jeśli nie tniesz tekst i masz już jedną linię. Powtarzasz tak do końca.
Reply
#10
Spoko. Zrobiłem coś co teoretycznie działa jak powinno, jednak mam spore obawy co do składni, czy ten kod powinien wyglądać mniej/więcej tak:

Code:
for(local i = 0; i < text.len(); i++){
        if(text.slice(i, i+1)==" "){//iteruje szukając spacji
       _width=textWidthPx(text.slice(0, i));//przypisuje długość od 0 do spacji zmiennej _width
            if(_width>_max_width){//sprawdzam czy jest większa niż powinna
            _chars_nr = i;//przypisuję numer w którym text przekracza nadane wartości
            i = text.len();
            }
        }
        }
:F ?

oczywiście zmienna _max_width to długość tekstury w pixelach -100
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)