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

Warunki i pętle w GM

środa, 07 Grudnia 2005, 12:11
Czas czytania 4 minuty, 59 sekund
Zgodne z GM: gm5 gm6 gm7 gm8
Trochę o warunkach i pętlach.
W warunkach bądź pętlach potrzebna będzie ci znajomość operatorów porównania takich jak 'A równe B' albo 'A mniejsze od B', pewnie znasz je z lekcji matematyki. Używamy w GMLu takich oto operatorów:
== - jeśli A jest równe B. Dość często użytkownicy GMLa stawiają pojedynczy znak '=', lecz program nie traktuje tego jako przypisania wartości zmiennej tylko jako znak równości, ale jest tak tylko w warunkach i pętlach (w PHP pojedynczy znak '=' zawsze oznacza przypisanie wartości zmiennej).
< - jeśli A jest mniejsze od B.
> - jeśli A jest większe od B.
>= - jeśli A jest większe równe od B. Pamiętaj ze zapis '=>' jest błędem!
<= - jeśli A jest mniejsze równe od B. Pamiętaj ze zapis '=<' jest błędem!
!= - jeśli A nie jest równe B.

Co to warunek? W GML jest to element który musi zostać spełniony aby wykonać jakieś instrukcje. Aby sprawdzić czy warunek jest spełniony (bądź nie) używa się 'if' (Pol. jeżeli), konstrukcja wygląda tak:
kodif (<warunek>) <instrukcja>; Instrukcja zostanie wykonana jeśli warunek został spełniony. Przy sprawdzaniu warunków potrzebne są operatory porównania.
Razem z 'if' można używać 'else' (Pol. w przeciwnym razie) czyli jeśli warunek nie został spełniony to mają być jakieś inne instrukcje. Konstrukcja wygląda tak:kodif (<warunek>)
{ <instrukcje_1>; }
else
{ <instrukcje_2>; }
Możesz też łączyć np. dwa warunki za pomocą takich znaków (operatorów logicznych):
&& - oznacza 'and' (jeśli oba warunki są spełnione).
|| - oznacza 'or' (jeśli jeden z warunków jest spełniony).
^^ - oznacza 'xor' (jeśli tylko jeden z warunków jest spełniony).
Teraz mały przykład:
kod//Wykona tylko jeśli wszystkie warunki są spełnione
if (wiek>=0)
&& (zycie<=0)
&& (imie=='Jasio')
{ /* Akcja */ }

//Wykona tylko jeśli jeden z warunków zostanie spełniony
if (wiek==100)
|| (zycie==0)
{ /* Akcja */ }
Wszystko jasne? Jeśli nie to zapraszam do przeczytania artykułu Sadama ;)
Przy każdej grze pojawia się naprawdę dużo tego typu warunków np. czy gracz wcisną klawisz albo czy ma 0 żyć. Wiec znajomość konstrukcji 'if' jest podstawa =] Podam jeszcze kilka przykładów żebyś zobaczył jak to wygląda w praktyce:
kodif (energia<=0) { /*Akcja*/ } else { /*Inna akcja*/ }
if (imie!='Jasio') { /*Akcja*/ }
if (czas==100) && (zycia>0) { /*Akcja*/ }
Przyjrzyjmy się jeszcze takiemu przykładowi:
kodif (posiada_przedmiot) { /*Akcja*/ }Zostanie tutaj sprawdzone czy warunek nie ma wartość 'false' (fałsz). Jeszcze jedna ciekawostka, nie musisz używać nawiasów '(' i ')' choć tak wygląda to czytelniej =)
Kolejnym typem warunku jest 'switch' (Pol. przełącznik). Jego konstrukcja wygląda tak:kodswitch (<warunek>)
{
case <wartosc_1>: <instrukcje_1>; ... ; break;
case <wartosc_2>: <instrukcje_2>; ... ; break;
...
default: <instrukcje>;
}
Jego działanie wygląda następująco:
1. Sprawdza <warunek> dla <wartosc_1>.
2. Jeśli jest spełniony to wykonuje <instrukcje_1>.
3. Kończy sprawdzanie kolejnych wartości dla warunku jeśli po instrukcjach znajduje się 'break' w przeciwnym wypadku powtarza kroki 1-3 aż do skończenia się wartości.
4. Jeśli żaden z warunków nie został spełniony to wywołuje instrukcje znajdujące się po 'default' (Pol. domyślne).

Pętla jest w pewnym stopniu warunkiem tylko ze tutaj instrukcje są wykonywane dopóki warunek jest spełniony. W pętlach używamy dwóch poleceń: break i continue. break przerywa wykonywanie pętli a continue zaś ją kontynuuje. Pierwsze z pętli która chce omówić jest pętla 'while' (Pol. dopóki). Jej konstrukcja wygląda tak:kodwhile (<warunek>) <instrukcje>;Instrukcje w pętli będą wykonywane do momentu nie spełnienia warunku bądź przerwania pletli.
Kolejna pętla jest 'do until' (Pol. rób dopóki). Jej struktura wygląda tak:koddo <instrukcje> until (<warunek>)Do tej pętli bardzo podobna jest pętla 'while' lecz jest jedna wielka różnica, w pętli 'while' najpierw sprawdzane są warunki a potem wykonywane instrukcje, zaś w 'do until' najpierw wykonywana instrukcja a potem sprawdzany warunek (wiec instrukcje zostaną przynajmniej 1 raz wykonane).
Najprostsza z pętli jest 'repeat' (Pol. powtarzaj). Powtarza ona po prosu jakieś X razy instrukcje. Jej konstrukcja wygląda tak:kodrepeat(<ilosc powtorzen>) <instrukcje>;Jest jeszcze pętla 'for' (Pol. dla). Jest dość trudna do zrozumienia, sam długi okres czasu nie mogłem dojść jak działa. Jej konstrukcja wygląda następująco:kodfor(<wartosc_poczatkowa>;<warunek>;<instrukcja>;) <inne instrukcje>;W działaniu wygląda ona tak:
1. Tworzy zmienną o wartości <wartosc_poczatkowa>.
2. Sprawdza <warunek>.
3. Wykonuje <instrukcja>.
4. Powtarza kroki 2-4 aż do momentu gdy warunek nie zostanie spełniony.
Teraz mały przykład:kodfor(n=1;n<10;n+=1;) { /*Jakas akcja*/ }Instrukcja będzie wykonywana dopóki zmienna n będzie mniejsza od 10. Ważne są tutaj te średniki wiec pamiętaj żeby zawsze je postawić gdzie trzeba =D

To tyle jak narazie =] Teraz włącz sobie Game Makera i przećwicz wszystko kilka razy ;)
Komentarze (łącznie 35, wyświetlam 16 - 30):
Matthew_Kane (Pon., 02 Paź. 06, 19:45)
#16

a propos: co oznacza xor?

BP Ultimate (Wto., 03 Paź. 06, 07:18)
#17

Google twoim przyjacielem - jeden z pierwszych wyników:
pl.wikipedia.org/wiki/XOR

Tymon (Wto., 03 Paź. 06, 08:36)
#18

a | b | a xor b
1 | 1 | 0
0 | 1 | 1
1 | 0 | 1
0 | 0 | 0

maly158 (Czw., 02 Lis. 06, 10:21)
#19

Wszystko OK.
Co do pętli FOR może i jest zakręcona, ale bardzo użyteczna.
Kiedy programowałem w C++ i TP bardzo ją lubiłęm. Z tego co zauważyłem Pan Overmars w tworzeniu GML opierał się w znacznym stopniu na C++ - tak jest też z pelą FOR - działa identycznie jak w C++. Przedstawię to na przykładzie:
Chcemy aby pętla FOR kontrolowała zebranie przez naszego bohatera gry 100 monet. Ale monety mogą leżeć po jednej lub w sakiewkach po 5 sztuk.
Tworzymy sobie zmnienna "a", która bądzie przyjmować wartość 1 kiedy nasz bohater trafi na 1 monetę i watość 5 kiedy trafi na sakiewkę. Wtedy nasza pętla
wygląda tak:
for (n=0;n<100;n=n+a)
{
<nasz bohater znalazł kasę>
<jeżeli znalazł monetę to "a=1">
<jeżeli znalazł sakiewkę to "a=5">
}
Akcja będzie się powtarzać , aż zbierzemy 100 monet, a potem jakiś bonus.
Może taki przykład wykorzystania pętli "for" komuś pomoże lepiej ją zrozumić.

Tymon (Czw., 02 Lis. 06, 12:42)
#20

Ja bym teraz jeszcze inaczej to przedstawił :) Wiecie przecież że FOR można przedstawić jako WHILE, nie? :D Więc:
for(n=0;n<100;n+=1){
//Kod
}
to inaczej:
n = 0;
while(n<100)
{
//Kod
n+=1;
}
i wystarczy wytłumaczyć tylko działanie WHILE =P

Matthew_Kane (Czw., 02 Lis. 06, 16:04)
#21

while = dopóki

Dark Maximal (Czw., 02 Lis. 06, 16:40)
#22

Łał, geniusz z Ciebie =D

Marmot (Czw., 02 Lis. 06, 21:18)
#23

A ja nadal będę wam spamował, żebyście kurcze blade dali ten mój artykuł o gml na gmclan! :)

P
Patrysław (Pią., 03 Lis. 06, 09:01)
#24

Wyślij mi PM żebym nie zapomniał, to dzisiaj po południu dodam.

Matthew_Kane (Pią., 03 Lis. 06, 16:03)
#25

Quote
[Łał, geniusz z Ciebie =D]
Dzięki, wiedziałem, że jestem geniushem :] Byłem po prostu zbyt skromny...

M
Markuz (Pon., 28 Cze. 10, 17:19)
#26

Błąd w ostatnim kodzie:
for(n=1;n<10;n+=1;) { /*Jakas akcja*/ ) - zamiast nawiasu ) powinna być klamra }
:)

Tymon (Pon., 28 Cze. 10, 19:42)
#27

Jesteś genialny! Znalazłeś błąd w kodzie sprzed 5 lat.

gnysek (Pon., 28 Cze. 10, 20:05)
#28

Myślę, że komentarz w Twoim awatarze mówi wszystko na ten temat :P

M
Markuz (Wto., 29 Cze. 10, 08:03)
#29

Heh ludzie nadal korzystają z tych tutków, ale jak chcecie ....

Tymon (Wto., 29 Cze. 10, 09:08)
#30

Jakbym mógł to sam bym dawno poprawił ten artykuł.

Najnowsze wersje GameMakera:

Stabilna
2024.14.2.213 • 2024.14.2.256
wydana 10 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 390 dni temu
Beta
2024.1400.2.941 •
2024.1400.2.926
 0.19.0

wydana 18 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
44 użytkownicy online na discordzie:
🧁Cupcake🧁, Nikas, LeD, Nitro Slav, Carl-bot, Fox, GibkiKaktus, HappyOrange, Wielki Druid, Kysiu, TobiasM (Morgo), Kuzyn, OdrzuconyKrakers, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, m..., r..., Threef, Chell, Destiny, Moldis, yazaa, Dyno, Morro, Voytec, Skovv, Danieo, bagno, antek, Arrekin, Tidżi, Mtax, MrTesterr, GreenClover, s..., Sporek, l..., Cebul, 42traviss, d..., Krzysiek1250, h..., Shockah, Nero, xVANiLL
Shoutbox
K
Kamilek (21:57, 08.12.25)
Ale klimat tu znowu wrócić! :-D
Wojo (13:03, 07.12.25)
Żeby nie było to jednak discord jest żywy :)
Wojo (12:50, 07.12.25)
Ehh znak czasu. Prawie dwa miesiące ciszy w shoutboxie, na forum też raczej cisza i jest głównie swego rodzaju archiwum ostatnich dwóch dekad
gnysek (16:01, 16.10.25)
To już google decyduje. Mam wrażenie, ze po datach obcina stare treści.
S
Sutikku (10:42, 14.10.25)
Ja jeszcze trafiam na fora jak szukam konkretnych haseł (chociażby wczoraj zepsuty pendrive który się identyfikuje jako Phison 2307 Boot ROM). Teraz projekty opensource często mają społeczności na discordzie i tam jest tona przydatnych informacji ale niedostępna poza discordem. Fajnie by to było wyeksponować
Korodzik (04:24, 14.10.25)
A w sumie to forum się normalnie indeksuje w wyszukiwarkach? Bo ja stwierdziłem, że np. w Google ciężko znaleźć cokolwiek z gmclanowego forum. Większość tematów jest chyba nieindeksowana od dawna...
S
Sutikku (08:44, 13.10.25)
mam niedokończony projekt bota, którego dodaje się do discorda, a on synchronizuje wiadomości z discorda -> na readonly forum. Wtedy treści mogą być indeksowane z wyszukiwarek i łatwo dostępne bez logowania. No ale leży w czyśćcu i czeka.
Wojo (11:52, 11.10.25)
Może kiedyś powróci moda na fora internetowe. Pamiętam w sumie, że czasami aktywność rosła i malała, ale tak pusto to chyba jeszcze nigdy nie było i myślę, że ta cała migracja użytkowników jest zasługą Discorda i zmiany czasów. Po prostu lata dwudzieste spowodowały zmiany trendów w internecie
S
Sutikku (09:06, 08.10.25)
najwyższa pora zopensourcować kod gmclanu!
gnysek (10:33, 06.10.25)
Może tak zrobię :D Jak znajdę czas :D
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?