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.2.0.132 • 2024.2.0.163
wydana 54 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 193 dni temu
Beta
2024.400.0.549 • 2024.400.0.567
wydana  4 dni temu
= IDE, = Runtime
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
35 użytkowników online na discordzie:
Kysiu, s..., Alice, Nitro Slav, Carl-bot, Voytec, Jamabaiz (Matrix_), Grela, Add92, Kowu, OdrzuconyKrakers, Filyps, fervi, Sevitaus, LadyLush, Cysior, lethian, chleb, MKP (GEM), yazaa, Dyno, debil debilowski, ZYGZAK, Miłosz, m..., Sporek, Danieo, HappyOrange, l..., moeglich, Krzysiek1250, Shockah, 🧁Cupcake🧁, TobiasM (Morgo), xVANiLL
Shoutbox
gnysek (20:44, 11.04.24)
Niektórzy dlatego wybierają GMEdit. Ale ja liczę na Code Editor 2, tylko na razie zbyt zbugowany jest.
Tymon (16:11, 11.04.24)
Stitch dla mnie osobiście jest lepszy bo nie musze kopać się z interfejsem GMa i mogę tylko pisać kod.
Tymon (16:05, 11.04.24)
Yes. Obecny nie jest taki zły, jak zainstalowałem najnowszą stabilną to w porównaniu z tym czego używałem... 10 lat temu...? Wszystko wydaje się lepsze.
gnysek (22:48, 10.04.24)
bscotch/stitch ? Ja czekam na fixy do nowego edytora, bo wszystko wydaje się dziś lepsze od tego obecnego :D
Tymon (19:54, 10.04.24)
Hm, Stitch okazuje się całkiem dobrą alternatywą dla wbudowanego edytora
Wojo (22:16, 08.04.24)
siemano huder myślałem, że zniknąłeś całkiem z gmclanu bo na discordzie cie nie ma :D
I am Lord (00:37, 05.04.24)
O dzięki :D
gnysek (09:58, 02.04.24)
Znalazłem na podstawie jego postów: youtube.com/@Jakim_
I am Lord (20:16, 01.04.24)
Ktoś ogarnia jakie konto miał Jakim na YT?
gnysek (16:07, 29.03.24)
Nowy Edytor kodu jednak po świętach
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?