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 1 - 15):
Z
Zakol (śro., 07 Gru. 05, 14:51)
#1

Wszystko OK; co do opertorów logicznych, są jeszcze:

div : (division) podzielić przez (np. '256 div 4' zwróci nam 64);
mod : (modulo) reszta dzielenia (np. 256 mod 13' zwróci nam 9);
~ : ( wartosc * -1 ) -1 (np. '~100' zwróci nam -101);

Czociaż nie jestem pewien co do tej tyldy :P

Tymon (śro., 07 Gru. 05, 15:01)
#2

Nie, nie :D To ja też spaprałem. < > == >= i <= są operatorami porównania, || && i ^^ są operatorami logicznymi :P

Z
Zakol (śro., 07 Gru. 05, 15:11)
#3

Zaś ^^' jest operatorem zażenowania.

B
Ojciec Rydzyk (śro., 07 Gru. 05, 15:13)
#4

A (_!_) jest operatorem czego?

Tymon (śro., 07 Gru. 05, 15:17)
#5

Weźcie przestańcie gadać głupoty :[ Powiedzili byście mi czy nie popełniłem błędów :P

M
~Maximal_bez_logu (śro., 07 Gru. 05, 21:09)
#6

Ja błędów nie widzeeeee! Congratulations for Tyyyymoon! ^^ :P

B
Ojciec Rydzyk (Czw., 08 Gru. 05, 14:10)
#7

Tymon, solidny gość więc robi solidne arty. Poza tym lubie go, skurczybyka jednego :P

gnysek (Czw., 08 Gru. 05, 18:36)
#8

xor (exor) to inaczej o ile pamiętam =a*b+!a*!b (bramka logiczna Exor).
Więcej na ten temat już wkrótce, jak stworze artykuł o tablicach Karnagha (czyt. Karno).

Pozatym mozna było wspomniec, że można też pisac and or i then.

Tymon (Pią., 09 Gru. 05, 07:53)
#9

Gnysek@ pl.wikipedia.org/wiki/XOR
Logika leży :P

gnysek (Pią., 09 Gru. 05, 15:38)
#10

Nie leży, bo to przepisałem z zeszytu od układow cyfrowych - lekcji o bitach i bramkach.

p
~progsoft (Sob., 18 Lut. 06, 22:18)
#11

to samo co w C++, pójdzie gładko :-)

CRASH (Czw., 24 Sie. 06, 13:31)
#12

Niewiem gdzie wpisać kod...HELP!!

Dawidsu (Beaver Interactive) (Czw., 24 Sie. 06, 13:40)
#13

Nie wpisać, a wklepać! To zasadnicza różnica! A gdzie? Na brzuchu, oczywiście! Wtedy kod zwraca dźwięki pac, pac, pac! Można jeszcze spróbować na tyłku, ale efekty są gorsze. W porównaniu do tych z brzucha, wręcz do dupy...

Choosen (Czw., 24 Sie. 06, 16:38)
#14

"//Wykona tylko jeśli jeden z warunków zostanie spełniony
if (wiek==100)
|| (zycie==0)
{ /* Akcja */ }"
A nie prawda bo wykona się jesli PRZYNAJMNIEJ jeden z warónków jest spełniony a w logice zdań to wielka różnica. Poza tym artykuł jest chaotyczny i gdybym doskonale nie wiedział tego o czym piszesz pewnie nie połapałbym się co masz do przekzania ;-) dam 5

Tymon (Pon., 02 Paź. 06, 08:01)
#15

Teraz to czytam i... rzeczywiście chaotyczny :P Może by to przepisać jeszcze raz. Zobaczymy. Co do ||, czy ja wiem. Dla normalnego człowieka te zdania mają identyczne znaczenia. Ale rzeczywiście przydało by się tutaj "przynajmniej" bo "jeśli jeden z warunków zostanie spełniony" kojarzy mi się teraz z xor xD

Najnowsze wersje GameMakera:

Stabilna
2024.2.0.132 • 2024.2.0.163
wydana 43 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 182 dni temu
Beta
2024.400.0.532 • 2024.400.0.551
wydana 14 dni temu
= IDE, = Runtime
Użytkownicy online
2 użytkowników aktywnych:
gości: 1, userów: 1
 Cannon Fodder
(~ostatnie 15 minut)
Discord
48 użytkowników online na discordzie:
Kysiu, s..., Alice, DungeonFairy🧚, Nitro Slav, Carl-bot, p..., Dominator2v, Grela, Wielki Druid, TinyFish, Add92, 21Lancz, Kowu, OdrzuconyKrakers, Filyps, fervi, Radek Ignatów, Kalor, r..., antek, LadyLush, lethian, VanhGND, HappyOrange, MKP (GEM), Arrekin, MagnusArias, Domeen0, Dyno, 🆅🅸🆃🅾74🅼, Deusald, Korodzik, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, LeD, Ulti, 🧁Cupcake🧁, bagno, Mtax, g..., l..., Alkapivo, moeglich, Nikas, Krzysiek1250, Shockah, Kandif, exigo
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?