Administratorzy gnysek Opublikowano 26 Sierpnia 2015 Administratorzy Udostępnij Opublikowano 26 Sierpnia 2015 Potrzebowałem na potrzeby silnika wyświetlania dialogów w Almorze skryptu, który mi automatycznie podzieli zdania tak, żeby po wyświetlaniu na ekranie nie były one szersze niż X pikseli. Jak pewnie wiecie, takie coś robi draw_text_ext() w GM, aczkolwiek ja potrzebowałem, żeby to przypisać do zmiennej, bo poza tym z tekstem chciałbym jeszcze dalej zrobić coś jeszcze :) Napisałem więc taki skrypt, prosiłbym o sprawdzenie i ew. znalezienie miejsc do optymalizacji, bo wydaje mi się, że gdzieś wpadłem we własne sidła i kodu mogło by być nieco mniej (aczkolwiek jest szybki i raczej bez błędów). Testowałem go na normalnym tekście, tekście co już ma znaki #, oraz na tekście, gdzie słowo na bank jest dłuższe niż te X pikseli (stąd trzeci argument, który mówi, czy łamać takie słowa czy zostawić je szersze). GML /// string_wordwrap_ext(string,length,hardbreak) // // Returns a string which have newline # insterted // on same positions, that draw_text_ext would insert them // ! remember to set font style before using ! // // string text to word wrap, string // length maximum string length before a line break, real // hardbreak to break if a word is longer than max length (word like this will always start from new line) // /// { var str,len,brk,out,inbuff,wordbuff,currchar; str = argument0; len = argument1; brk = argument2; out = ""; inbuff = ""; wordbuff = ""; currchar = ""; while (string_length(str)) { currchar = string_copy(str,1,1); str = string_delete(str,1,1); if (currchar == "#") { out += inbuff + wordbuff + currchar; inbuff = ""; wordbuff = ""; } else if (currchar == " ") { inbuff += wordbuff; wordbuff = currchar; } else { wordbuff += currchar; } if (string_length(str) == 0) { out += inbuff + wordbuff; } else if ((brk == true) and (string_width(wordbuff) > len)) { out += string_copy(wordbuff, 1, string_length(wordbuff)-1) + '#'; wordbuff = string_copy(wordbuff, string_length(wordbuff), 1); } else if (string_length(inbuff) > 0 and string_width(inbuff + wordbuff) > len) { out += inbuff + "#"; inbuff = ""; if (string_copy(wordbuff,1,1) = " ") { wordbuff = string_delete(wordbuff,1,1); } } } return out; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 26 Sierpnia 2015 Udostępnij Opublikowano 26 Sierpnia 2015 GML counter = 0; for( int i=0; i< string_length(str); i+=1 ) { counter+=1 if( counter < len ) //jak dlugosc ok to dodajemy literke do naszego slowa { worldbuff += str; if( str=='#' ) counter=0; if( str=='#' || str==' ' ) { out +=wordbuff; wordbuff = ""; } else { if( brk && string_length(wordbuff)>=len ) { out += wordbuff + "#"; wordbuff = str; counter=1; } else { out +="#"; worbuff += str; counter = string_length(wordbuff) } } } out += wordbuff; return out; Tak na oko robione, nie pamiętam już dobrze gmla więc coś może nie stykać. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 26 Sierpnia 2015 Autor Administratorzy Udostępnij Opublikowano 26 Sierpnia 2015 Ale to nie sprawdzi szerokości w pikselach :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się