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 15 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 154 dni temu
Beta
2024.400.0.516 • 2024.400.0.537
wydana  5 dni temu
= IDE, = Runtime
Użytkownicy online
2 użytkowników aktywnych:
gości: 1, userów: 1
 Adriann
(~ostatnie 15 minut)
Discord
31 użytkowników online na discordzie:
DungeonFairy🧚, s..., Alice, Nitro Slav, Carl-bot, p..., Grela, Add92, SuperEnduro, Kowu, Kuzyn, OdrzuconyKrakers, Filyps, fervi, YoungKrystian, Kalor, PhysX ᴺⱽᴵᴰᴵᴬ, r..., 🧁Cupcake🧁, antek, lethian, HappyOrange, Pako, Arrekin, Dyno, Ulti, bagno, g..., moeglich, Shockah, exigo
Shoutbox
I am Lord (19:15, 17.03.24)
6h mam na to hmmm
I am Lord (19:06, 17.03.24)
Ale temat fajny
gnysek (01:33, 13.03.24)
Powinno działać, jest w kodzie sortowanie wg. najbliższego startu :)
Uzjel (21:59, 11.03.24)
Nie, ale za pierwszym razem zrobiłem fuckup, że było "Tura testowa" X_X
I am Lord (16:58, 11.03.24)
A co Uzjel już masz nawymyślane 100 tematów? 😅
Uzjel (20:08, 10.03.24)
@gnysek a jak bym dodał kilka lig na raz to walnie?
Uzjel (20:08, 10.03.24)
Liga będzie zawsze od piątku 16:00 do poniedziałku 23:59, zawsze w środku miesiąca.
gnysek (08:48, 10.03.24)
Tak, to też jest do poprawy X_X
Adriann (18:22, 09.03.24)
Tylko myślę czy nie leiej gdyby mówiło że zostało tyle i tyle dni i ileś godzin a nie tylko w godzinach ;d Albo konkretna data obok, byłoby czytelniej
I am Lord (15:08, 08.03.24)
o super z tą ligą :)
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?