Posts: 683
Threads: 20
Joined: Oct 2015
Siema, potrzebuję pomocy
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ść.
Posts: 576
Threads: 39
Joined: Dec 2015
Reputation:
672
20.04.2017, 16:13
(This post was last modified: 20.04.2017, 16:14 by KimiorV.)
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...
Posts: 683
Threads: 20
Joined: Oct 2015
20.04.2017, 16:22
(This post was last modified: 20.04.2017, 16:23 by Son Goku.)
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.
Posts: 576
Threads: 39
Joined: Dec 2015
Reputation:
672
Wyciągaj fragment tekstu litera po literze, wrzucaj go do tej funkcji textWidth(string text) i sprawdzaj długość.
Posts: 631
Threads: 42
Joined: Sep 2015
Reputation:
1,077
Order:
Albo lepiej wrzuć cały i odejmuj jeśli przekracza zakres
Posts: 233
Threads: 80
Joined: Oct 2015
Reputation:
619
20.04.2017, 22:45
(This post was last modified: 20.04.2017, 22:52 by Zmorra.)
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
Posts: 683
Threads: 20
Joined: Oct 2015
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.
Posts: 683
Threads: 20
Joined: Oct 2015
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?
Posts: 631
Threads: 42
Joined: Sep 2015
Reputation:
1,077
Order:
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.
Posts: 683
Threads: 20
Joined: Oct 2015
08.05.2017, 21:17
(This post was last modified: 08.05.2017, 21:27 by Son Goku.)
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
|