Skocz do zawartości
MetalowyNerd

Jak wykryć nowe linie w stringu?

Rekomendowane odpowiedzi

Witam. Wie ktoś, jak obliczyć/pozyskać liczbę nowych linii zrobionych automatycznie w draw_text_ext()? W argumencie "w" ustawia się długość w pikselach, po ilu ma zostać wrzucona nowa linia. Chciałbym wiedzieć, ile razy została ta nowa linia wykonana w tym jednym draw_text_ext(). Manualnie tego zrobić nie mogę przez "\n".

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Generalnie to się nie da. Ale można podejść do tego inaczej. Najpierw złamać tekst, a wtedy policzyć linie.

 

Do tego jest już gotowy customowy skrypt: https://www.gmlscripts.com/script/string_wordwrap

 

string_wordwrap(string,length,break,split) - string to tekst, length to długość, break to znak łamania, a split to true/false czy łamać słowa w połowie.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ehh, to będę musiał to inaczej ogarnąć :/, myślałem, że to w miarę proste. Chciałem zrobić okno "konsoli" w grze, żeby były widoczne ostatnie komendy wyżej i żeby z każdymi nowymi wprowadzonymi, całość szła ku górze... a nie zrobię przecież nieskończonego stringa :/

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ja okno konsoli zrobiłem na ds_list. Każda lista to osobny string. Wtedy możesz policzyć linie po prostu licząc listy w tablicy :D
terminal.gif

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Tak, opcja super, tylko jeśli tekst w jednej linii będzie za długi? To jak go automatycznie przerwiesz, żeby reszta była w linii poniżej?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

draw_text_ext(x, y, lista[| i], 20, 300); 
Powinno łamać tekst... chociaż? Nie wiem, musiałbym popróbować. Wydaje mi się, że będzie łamać tekst, ale mogą się nachodzić góra/dół :/ 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Hej, zrobiłem coś takiego. Linie liczy, a żeby pokazywał tylko kilka pierwszych/ostatnich to pewnie wystarczy tylko zmienić pierwszy/drugi argument w forze.
Projekt [gm:s2] - https://gmclan.org/up8556_18_Line_counter.html

Zrobiłem liste, a w Draw umieściłem kod:
 

var _break = 5; //Przerwa pomiędzy linijkami
list_height = 0; //zeruj

for(var i = 0; i < ds_list_size(list); i++)
{
	draw_text_ext(5, 5 + (list_height), string(i+1) + ". " + string(list[| i]), 20, 300);	

	list_height += string_height_ext(list[| i], 20, 300)+_break;
	
}



line_counter.gif

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ooo, czyli się da. Teraz muszę jeszcze rozgryźć, jak ogarnąć usuwanie od góry tylu linii i przesuwanie o tyle do góry, co będzie miało najnowsze wprowadzone zdanie. Dzięki SimianVirus7. Kodzik krótki, to powinienem ogarnąć :). A z ciekawości, ile taka tablica może pomieścić takich linii?

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Raczej ogranicza Cię tylko RAM komputera. Przy 16gb nic nie stanęło mi na przeszkodzie, żeby zrobić 45mln elementów w tablicy. Przy pustym pokoju i tylko wypisywaniu każdej linijki, przy 30tyś, fps spadł do 30 klatek. 

Choć pewnie ktoś z tego forum (choćby Gnysek), może powiedzieć o tym wiele więcej :P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

To pozostaje mi co ileś tysięcy komend wyczyścić tablicę, bo w tym projekcie utrata klatek będzie wyjątkowo głupia i nieuzasadniona patrząc z perspektywy gracza

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zawsze możesz zapisywać co jakiś czas linijki do pliku tekstowego i wczytywać je stopniowo. Czyli mieć to jakby podzielone na części, np.

Jeśli numer_linijki >= 100 wtedy doczytaj drugie 100 z pliku tekstowego. Jeśli numer_linijki <= 99 wtedy doczytaj pierwsze 100 z pliku tekstowego. 
No coś w ten deseń :P

(pseudokod jak marzenie) 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Oki dzięx za czas, coś z tym zrobię :)

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

ja tak teraz jeszcze dodam, ze ogólnie to konsola ma zazwyczaj czcionkę o stałej szerokości, więc dzielenie na kolejne linijki jeśli można tekst łamać w dowolnym miejscu jest dziecinnie proste i łatwo to do tablicy przypisać, bo znasz limit znaków i nie musisz liczyć szerokości/wysokości.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
9 godzin temu, gnysek napisał:

ja tak teraz jeszcze dodam, ze ogólnie to konsola ma zazwyczaj czcionkę o stałej szerokości, więc dzielenie na kolejne linijki jeśli można tekst łamać w dowolnym miejscu jest dziecinnie proste i łatwo to do tablicy przypisać, bo znasz limit znaków i nie musisz liczyć szerokości/wysokości.

O to chodzi, że nie można łamać w dowolnym miejscu, bo tylko przed kolejną przerwą/spacją, bo inaczej gra będzie niezbyt czytelna, a to będzie gra tekstowa. Żeby stworzyć taką czcionkę, w której każdy znak ma identyczną szerokość (jak w konsoli Win'a np), to pewnie trzeba stworzyć czcionkę z bitmapy, prawda? Nie ma opcji stworzenia takiej ze zwykłej czcionki?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zadziała każda czcionka monospace, np. Courier New, Lucida Console, Consolas itp. Nie możesz łamać tylko przed kolejną spacją, bo jak słowo jest dłuższe niż maks. szerokość, to nigdy nie złamie, gdzieś musi być na twardo ;) A samo łamanie jest w skrypcie który podałem w moim pierwszym poście. Wystarczy przerobić kod, zeby zamiast łamać przypisywał do kolejnego elementu tablicy.

 

Tu masz moją konsolę: https://marketplace.yoyogames.com/assets/2444/in-game-console

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko 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ę tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×