Skocz do zawartości

string_wordwrap_ext()


Rekomendowane odpowiedzi

  • Administratorzy

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

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

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...