Ten artykuł został stworzony dla starszych wersji GameMakera i może nie być aktualny.

O stringach słów kilka

Niedziela, 25 Marca 2007, 15:31
Czas czytania 12 minuty, 24 sekundy
Zgodne z GM: gm5 gm6 gm8 gms1
Dzisiaj się zajmiemy stringami, czyli inaczej - łańcuchami znaków. Poznamy przeróżne funkcje, które pozwalają nam operować stringami.
[SIZE=13px]Początek[/SIZE]

Dzisiaj się zajmiemy [KOLOR=blue]stringami[/KOLOR], czyli inaczej - łańcuchami znaków, mówiąc prościej - tekstem. Na początek podam przykład zmiennej typu string:

kodzmienna1="To jest tekst";
Łańcuchy można również otwierać i zamykać apostrofami:

kodzmienna1='To jest tekst';
Do każdej takiej zmiennej możemy dopisywać kolejne wiadomości:

kodzmienna1='To jest ';
zmienna1+='tekst';

...co w rezultacie da "To jest tekst". Trzeba pamiętać, że nie można mieszać zmiennych typów [COLOR=blue]string[/COLOR] i [COLOR=blue]real[/COLOR]:

kodzmienna1='Życia: ';
zmienna1+=lives;

Jak możemy się domyślać, w trakcie gry wyskoczy nam komunikat o błędzie. Na szczęście istnieje obejście - każdą zmienną liczbową można bezproblemowo zamienić na ciąg znaków. Służy do tego funkcja [COLOR=darkblue]string(val)[/COLOR], gdzie val to zmienna typu [COLOR=blue]real[/COLOR]. Jak ją wykorzystać do powyższego przykładu?

kodzmienna1='Życia: ';
zmienna1+=string(lives);

O, tak. Teraz jest w porządku. Przy funkcji [COLOR=darkblue]string(val)[/COLOR] możemy zamiast val podstawiać mniej lub bardziej skomplikowane działania.

kodzmienna1=string((15+liczba1*liczba2)/4);
Komendą przeciwną do [KOLOR=darkblue]string(val)[/KOLOR], tj. zamieniającą ciąg znaków na wartość liczbową, jest [COLOR=darkblue]real(string)[/COLOR]:

kodstring1="20";
real(string1);

Możemy także sprawdzić, czy dana zmienna jest zmienną liczbową/tekstową. Używamy do tego [COLOR=darkblue]is_real(zmienna)[/COLOR] lub [COLOR=darkblue]is_string(zmienna)[/COLOR].

kodzmienna1="20";
zmienna2=is_real(zmienna1);

Jeśli warunek zostanie spełniony, [COLOR=blue]zmienna1[/COLOR] przyjmie wartość 1 ([COLOR=darkred]true[/COLOR]). W powyższym skrypcie otrzymamy 0 ([COLOR=darkred]false[/COLOR]), gdyż [COLOR=blue]zmienna1[/COLOR] mimo wszystko jest [COLOR=blue]stringiem[/COLOR].

[SIZE=13px]Wbudowane zmienne[/SIZE]

Dobrze, mniej więcej zaznajomiliśmy się z podstawami. Wyobraźmy sobie, że chcemy zrobić okienko, w którym gracz może sobie wpisywać tekst. Domyślną, wbudowaną zmienną, w której znajdują się wszystkie znaki wpisywane przez gracza, jest [COLOR=blue]keyboard_string[/COLOR]. Najprostszym sposobem jest rysowanie tekstu za pomocą funkcji [COLOR=darkblue]draw_text(x,y,string)[/COLOR]. Poniższy skrypt umieszczamy w DRAW:

koddraw_text(x,y,keyboard_string);
Oczywiście za [COLOR=blue]x[/COLOR] i [COLOR=blue]y[/COLOR] podstawiamy własne wartości.

Poza [COLOR=blue]keyboard_string[/COLOR] istnieją jeszcze inne wbudowane zmienne. Są to:

[COLOR=blue]keyboard_key[/COLOR] - zawiera numer ASCII (keycode) aktualnie wciskanego klawisza ([COLOR=blue]real[/COLOR]).
[COLOR=blue]keyboard_lastchar[/COLOR] - zawiera znak ostatnio naciśniętego klawisza ([COLOR=blue]string[/COLOR]).
[COLOR=blue]keyboard_lastkey[/COLOR] - j/w, jednak zamiast znaku mamy tu numer ASCII ([COLOR=blue]real[/COLOR]).

[SIZE=13px]Co zostało wciśnięte?[/SIZE]

Teraz zajmiemy się podstawowymi funkcjami sprawdzającymi, czy dany klawisz nie został wciśnięty. Możemy sprawdzić, czy jakiś konkretny przycisk jest obecnie wciskany - [COLOR=darkblue]keyboard_check(key)[/COLOR], gdzie key to numer ASCII danego klawisza (wygodniej jest korzystać ze stałych zaczynających się od vk_ - przykładowo stała [COLOR=darkred]vk_enter[/COLOR] przypisana jest klawiszowi ENTER):

kodif keyboard_check(vk_right)
{x+=1;}

Kod ten będzie przesuwać obiekt o jeden piksel w prawo, jeśli tylko będzie wciskana strzałka w prawo.

[COLOR=darkred]UWAGA[/COLOR]: Lista klawiszy znajduje się w dokumentacji.

Drugą z kolei funkcją jest [COLOR=darkblue]keyboard_check_pressed(key)[/COLOR]. Różni się ona od poprzedniej tylko tym, iż wykonuje daną akcję tylko raz przy zapętlonym zdarzeniu:

kodif keyboard_check_pressed(vk_right)
{x+=32;}

Za każdym razem, gdy wciśniemy strzałkę w prawo, obiekt przesuwać się będzie jednorazowo o 32 piksele w prawo.

Jest jeszcze ostatnia funkcja, mianowicie [COLOR=darkblue]keyboard_check_released(key)[/COLOR]. Działa jak powyższa, z tą jednak różnicą, że wykonuje warunek, jeśli dany klawisz puszczamy. Przykład użycia:

kodif keyboard_check_released(vk_escape)
{game_end();}

Powyższy skrypt zakończy grę, gdy puścimy klawisz ESCAPE.

Jest jeszcze jedna funkcja, funkcja dość rzadko używana - [COLOR=darkblue]keyboard_check_direct(key)[/COLOR], która działa jak [COLOR=darkblue]keyboard_check(key)[/COLOR]. Jest jednak mała, drobna różnica: warunki zbudowane na [COLOR=darkblue]keyboard_check_direct(key)[/COLOR] działają również, gdy zminimalizujemy naszą grę/program.

Zastanówmy się jednak, co zrobić, gdy chcemy stworzyć warunek, który sprawdzałby, czy został wciśnięty klawisz, dajmy na to, A. Nie możemy wpisać pod key po prostu A, gdyż Game Maker potraktuje to jako zmienną. Z pomocą idzie nam
[COLOR=darkblue]ord(str)[/COLOR] - funkcja zwracająca numer ASCII literki:

kodif keyboard_check_pressed(ord('Q'))
{game_end();}

Odwrotnością tej funkcji jest [KOLOR=darkblue]chr(val)[/KOLOR], która zamienia keycode na znak ([COLOR=blue]string[/COLOR]).

kodzmienna1=65;
zmienna2=chr(zmienna1);

[COLOR=blue]Zmienna2[/COLOR] zamieni się w [COLOR=blue]string[/COLOR] "A".

[COLOR=darkred]UWAGA[/COLOR]: Przy funkcji [COLOR=darkblue]ord(str)[/COLOR] należy używać wyłącznie wielkich liter.

[SIZE=13px]Głupi Num Lock![/SIZE]

Możemy również sprawdzać, czy aktywny jest Num Lock. Robi się to za pomocą [COLOR=darkblue]keyboard_get_numlock()[/COLOR]. Można także z poziomu programu włączyć Num Lock - służy do tego [COLOR=darkblue]keyboard_set_numlock(on)[/COLOR], gdzie za on podstawia się [COLOR=darkred]true[/COLOR] (1; włączone) lub [COLOR=darkred]false[/COLOR] (0; wyłączone). Przykład użycia:

kodkeyboard_set_numlock(1-keyboard_get_numlock());
Przełącza (toggle) Num Lock z włączonego na wyłączony i vice versa.

Ciekawą funkcją oferowaną przez Game Maker jest możliwość "symulowania" wciśnięcia jakiegoś klawisza: [COLOR=darkblue]keyboard_key_press(key)[/COLOR] (wciśnięcie klawisza) oraz [COLOR=darkblue]keyboard_key_release(key)[/COLOR] (puszczenie).

Powyższe funkcje te jednak są rzadko używane w grach. Praktyczniejsze zastosowanie mają w programach.

[SIZE=13px]Chowaj się[/SIZE]

W Game Makerze możemy manipulować schowkiem. Pobieranie tekstu ze schowka staje się proste:

kodtekst=clipboard_get_text();
Można także wykonać odwrotną operację - przenieść tekst ze zmiennej do schowka:

kodclipboard_set_text(tekst);
GML pozwala także sprawdzić, czy w schowku znajduje się tekst: [KOLOR=darkblue]clipboard_has_text()[/KOLOR]:

kodif clipboard_has_text()=1
{tekst="Schowek jest pełny.";}
else{tekst="Schowek jest pusty.";}

[SIZE=13px]Change my... string?[/SIZE]

Same [COLOR=blue]stringi[/COLOR] można w Game Makerze zmieniać i modyfikować. Tym zajmiemy się za chwilę; teraz będzie sprawdzać nasze "łańcuchy". Najpierw sprawdźmy, jak długa jest nasza zmienna. Do tego służy [COLOR=darkblue]string_length(str)[/COLOR], gdzie str to oczywiście nasza zmienna. Przykładowo:

kodzmienna1="Ala ma kota.";
zmienna2=string_length(zmienna1);

Otrzymamy wynik 12, gdyż tyle znaków zawiera [COLOR=blue]zmienna1[/COLOR]. Z kolei do sprawdzania, czy w danym ciągu znaków znajduje się jakiś wyraz/literka, używa się funkcji [COLOR=darkblue]string_count(substr,str)[/COLOR], gdzie substr to szukany wyraz, a str - przeszukiwana zmienna. Wynikiem będzie liczba znalezionych fraz - jeśli nie ma takowej ani jednej - oczywiście zmienna będzie wynosić 0.
kodzmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_count("Ala",zmienna1);

Wynik, jak łatwo się domyślić, będzie wynosić 2 - tyle razy właśnie w [COLOR=blue]zmiennej1[/COLOR] pojawił się wyraz "Ala". Co teraz? Chcemy wiedzieć, jaka literka kryje się wybranym miejscu naszego ciągu. Używamy do tego [COLOR=darkblue]string_char_at(str,index)[/COLOR] - index to pozycja w tekście:

kodzmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_char_at(zmienna1,6);

Już wyjaśniam. Szukaliśmy znaku kryjącego się na szóstym miejscu (stąd notabene 6). Co otrzymamy? Proste - znak "a". Podobną w działaniu jest funkcja [COLOR=darkblue]string_pos(substr,str)[/COLOR]. Zwraca ona pozycję szukanego ciągu (substr) w całej zmiennej (str. Jeśli szukana fraza się powtarza, Game Maker bierze pod uwagę pierwszy znaleziony wyraz, jeśli nie występuje w ogóle - zwraca 0.

kodzmienna1="To_jest_przykładowy_tekst.";
zmienna2=string_pos("_",zmienna1);

Mimo iż znak "_" występuje więcej niż raz, [COLOR=blue]zmienna2[/COLOR] będzie mieć wartość 3 - jest to pozycja pierwszego z kolei znaku "_".

Sprawdzanie mamy za sobą. Zajmijmy się modyfikacją [COLOR=blue]stringów[/KOLOR]. Za pomocą kilku funkcji możemy manipulować wielkością tekstu:

- [COLOR=darkblue]string_lower(str)[/COLOR] - zamienia w zmiennej tekstowej str wszystkie litery na małe.
- [COLOR=darkblue]string_upper(str)[/COLOR] - zamienia w zmiennej tekstowej str wszystkie litery na duże.

Przykładowo:

kodzmienna1="TO jest JAKIŚ tekst";
zmienna2=string_lower(zmienna1);
zmienna3=string_upper(zmienna1);

Uzyskamy przy [COLOR=blue]zmiennej2[/COLOR] "to jest jakiś tekst", a przy [COLOR=blue]zmiennej3[/COLOR] - "TO JEST JAKIŚ TEKST". Oprócz zmiany wielkości można także pozbawiać zmienne np. liter/cyfr:

- [COLOR=darkblue]string_letters(str)[/COLOR] - usuwa z ciągu str wszystkie znaki oprócz liter.
- [COLOR=darkblue]string_digits(str)[/COLOR] - usuwa z ciągu wszystkie znaki oprócz cyfr.
- [COLOR=darkblue]string_lettersdigits(str)[/COLOR] - usuwa z ciągu wszystkie znaki oprócz liter i cyfr.

Są to bardzo proste w użyciu funkcje:

kodzmienna1="ABCDE_>!@_12345";
zmienna2=string_letters(zmienna1);
zmienna3=string_digits(zmienna1);
zmienna4=string_lettersdigits(zmienna1);

[COLOR=blue]Zmienna2[/COLOR] zawierać będzie "ABCDE" (spacje również są usuwane), [COLOR=blue]zmienna3[/COLOR] - "12345", a ostatnia zmienna - "ABCDE12345".

[COLOR=darkred]UWAGA[/COLOR]: Polskie znaki diaktryczne nie są traktowane jako litery.

Hm, a co teraz? Zostały nam funkcje, które pozwalają nam kopiować/zamieniać/wstawiać/usuwać fragmenty [COLOR=blue]stringów[/COLOR] - czyli rzeczy bardzo ważne i przydatne.

Pierwszą funkcją jest [COLOR=darkblue]string_copy(str,index,count)[/COLOR] - pozwala ona "wybrać" fragment zmiennej str o początku index i długości count.

kodzmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_copy(zmienna1,14,3);

Otrzymamy "Ala", ponieważ literka "A", czyli początek, znajduje się na wybranej przez nas czternastej pozycji (stąd 14), a długość wynosi 3.

Kolejną funkcją jest [COLOR=darkblue]string_delete(str,index,count)[/COLOR]. Działa identycznie jak poprzednia, lecz nie kopiuje, a usuwa tekst ze zmiennej.

kodzmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_delete(zmienna1,13,4);

Usunęliśmy fragment od pozycji 13 i długości 4. Zostało nam: "Ala ma kota. lubi go.".

Możemy nie tylko kopiować i usuwać dane ze zmiennej. Za pomocą [COLOR=darkblue]string_insert(substr,str,index)[/COLOR] da się wstawiać w wybrane miejsce (index) wstawić inny [COLOR=blue]string[/COLOR].

kodzmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_insert("bardzo ",zmienna1,18);

Wyniku "Ala ma kota. Ala bardzo lubi go." raczej nie muszę tłumaczyć.

Game Maker oferuje także możliwość zamieniania wybranych ciągów na inne; wszystko to za pomocą [COLOR=darkblue]string_replace(str,substr,newstr)[/COLOR] - gdzie substr to szukana fraza, a newstr - jej zamiennik. I, standardowo, przykładzik:

kodzmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_replace(zmienna1,"Ala","Jaś");

A cóż to? Otrzymaliśmy "Jaś ma kota. Ala lubi go.". Dlaczego? Funkcja [COLOR=darkblue]string_replace(str,substr,newstr)[/COLOR] zamienia pierwszy z brzegu wyraz. Do zmiany wszystkich fraz w jednym ciągu używa się funkcji [COLOR=darkblue]string_replace_all(str,substr,newstr)[/COLOR]. Przy użyciu tej metody uzyskamy "Jaś ma kota. Jaś lubi go.".

Została jeszcze ostatnia funkcja [COLOR=darkblue]string_repeat(str,count)[/COLOR], która najzwyczajniej powtarza nam dany ciąg count razy:

kodzmienna1="Ala ma kota. ";
zmienna2=string_repeat(zmienna1,2);

Wynik: "Ala ma kota. Ala ma kota. ."

[SIZE=13px]Others[/SIZE]

Jest masa innych funkcji, które operują łańcuchami. Są to na przykład wiadomości w okienkach (zaczynające się od [COLOR=darkblue]message_[/COLOR]). Przydatną funkcją, która pozwala graczowi wpisać ciąg znaków, jest [COLOR=darkblue]get_string[/COLOR]. Również przy zapisywaniu/odczytywaniu korzystamy ([COLOR=darkblue]get_save_filename[/COLOR]/[COLOR=darkblue]get_open_filename[/COLOR]) ze [COLOR=blue]stringów[/COLOR].

Przy operowaniu plikami w Game Makerze często korzystamy z tych oto zmiennych:

- [COLOR=blue]working_directory[/COLOR] - inaczej katalog z grą.
- [COLOR=blue]temp_directory[/COLOR] - windowsowy folder tymczasowy.

Każdy [COLOR=blue]string[/COLOR] da się bezpośrednio w aplikacji przetworzyć na skrypt GML - to wszystko za pomocą [COLOR=darkblue]execute_string(str)[/COLOR]:

kodzmienna1="instance_create(x,y,obj1);"execute_string(zmienna1);
[SIZE=13px]Zakończenie[/SIZE]

Oczywiście [COLOR=blue]stringi[/COLOR] to nie tylko teksty w grze. To także m.in. ścieżki do plików, wartości wyciągnięte z plików *.ini czy ciągi wzięte z plików tekstowych. Łańcuchy znaków są tak wszechobecne w Game Makerze, że nie sposób opisać wszystkich funkcji mniej lub bardziej z nimi związanych.

Pozdrawiam, Jakim.
Komentarze (łącznie 6):
Marek Siemaszko (Nie., 25 Mar. 07, 15:59)
#1

Super artykuł :) szkoda że nie dałeś go z miesiąc temu jak się z tym męczyłem :)

Zychu (Nie., 25 Mar. 07, 16:41)
#2

no moze byc ale takie to wszystko pogmatwane ;P

spyro (Nie., 25 Mar. 07, 22:44)
#3

Wow, na prawdę niezły artykuł xD W sam raz dla początkujących - pozwoli im dokonać tego pierwszego razu ze stringami :D

Marmot (Nie., 25 Mar. 07, 23:22)
#4

Kiedy artykuł "O figach słów kilka"?

Matthew_Kane (Wto., 27 Mar. 07, 15:49)
#5

Znalazłem błąd:
"Jeśli warunek zostanie spełniony, zmienna1 przyjmie wartość 1 (true). W powyższym skrypcie otrzymamy 0 (false), gdyż zmienna1 mimo wszystko jest stringiem." zmienna2 przyjmie wartość 1 (true).

s
paaawel12 (śro., 28 Mar. 07, 11:16)
#6

Nie ma tam błędu :P
zmienna1="20";
zmienna1 ma wartość "20" a nie 20 :P to string

Najnowsze wersje GameMakera:

Stabilna
2024.8.1.171 • 2024.8.1.218
wydana 59 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 388 dni temu
Beta
2024.1100.0.674 •
2024.1100.0.700
 0.13.0

wydana  wczoraj
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
Shoutbox
Borek (18:12, 07.11.24)
Właśnie dostałem powiadomienie z forum, że jestem na GMClanie 18 lat :D Ja pierdzielę...
S
Sutikku (08:43, 18.10.24)
TIL, gamemaker jest starszy ode mnie
gnysek (16:04, 15.10.24)
Za równo miesiąc, GameMaker kończy 25 lat.
Wojo (15:38, 05.09.24)
Ciekawe
gnysek (11:54, 14.08.24)
Ruszyła beta nowego runtime, a stary dostanie już tylko dwa ficzery (UI Layery i obsługę SVG jako vertexy).
Wojo (11:51, 14.08.24)
Co się stało?
gnysek (18:31, 25.07.24)
Ogłaszam nowy etap w historii GameMakera.
gnysek (11:36, 08.07.24)
Ale w sumie taki numer GG był bezpieczniejszy niż nr. telefonu czy kontakt społecznościowy. Utrudniał stalkowanie i ułatwiał banowanie.
Wojo (08:08, 08.07.24)
Niestety to już nie te czasy kiedy pytało się kasjerki o wiek i numer Gadu-Gadu...
Adriann (08:28, 05.07.24)
Albo okraść :|
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?