ࡱ> rtq`bjbj.> $#)f(h(h(h(h(h(h($)hA,B(Q(($$$f($f($$$ kp $f((0#)$,$,$$,J($(($ #) H H Game Maker Language (w skrcie: "GML") to jzyk skryptowy stworzony przez Marka Overmarsa na potrzeby programu Game Maker. Jest on u|ywany do ustalania i wykonywania automatycznych akcji przez program w dowolnym momencie. W Game Makerze mo|na go u|ywa w czterech miejscach: Scripts, Execute a Piece of Code, Creation Code oraz przy ustawianiu tzw. klockw. Jzyk ten ma skBadni i struktur przypominajce dobrze znane jzyki programowania takie jak C++ czy Pascal. Podstawowe zastrze|enia - Nazwy wszystkich zasobw gry (sprites, sounds, objects itd.) musz by r|ne i mog mie na pocztku tylko liter, a mog skBada si tylko z liter, liczb i podkre[leD "_". - Posiadajc niezarejestrowan wersj Game Makera, niektre funkcje mog nie dziaBa m.in. system Particle, obsBuga dodatkowych funkcji typu gradienty w tle itd. Struktura Piszc skrypt u|ywamy wielu poleceD, zwanych wyra|eniami (ang. statements). Pocztek skryptu powinno si zacz symbolem "{", a koDczy "}". Mimo to, na samym pocztku i na samym koDcu rzadko si u|ywa tych znakw, a ich brak nie jest uznawany przez Game Maker jako bBd. Po ka|dym wyra|eniu, stawiamy [rednik ";", na wzr innych jzykw programowania. Nie dajc go, program mo|e uzna, |e podane wyra|enie trwa dalej, np. w nastpnej linijce. Tak wic, nasz skrypt bdzie wygldaB mniej wicej tak: kod: { <wyra|enie>; <wyra|enie>; ... } Wyra|eD mo|e by bardzo wiele. Kilka z nich zostanie wymienionych w dalszej cz[ci artykuBu, ale wikszo[ z nich znajdziesz w pliku pomocy do Game Maker. Zmienne Podstawowe informacje GML jak wiele innych jzykw programowania zawiera zmienne. SBu| one do zapamitywania przez program pewnych warto[ci, np. poBo|enia obiektu w room. Zmienna mo|e zawiera liczb lub tekst (string). Zmienne w Game Makerze s deklarowane troch inaczej ni| w znanych jzykach programowania, ale te| wikszo[ jest ju| wbudowana, np. mouse_x lub mouse_y okre[lajce poBo|enie myszki. Nazwa zmiennej musi zaczyna si liter i mo|e zawiera litery, liczby i podkre[lenia "_" (maks. dBugo[ - 64 znaki). Deklarowanie Zmienne w GML deklarujemy w poni|szy sposb: kod: <zmienna> = <warto[>; Deklarowa mo|na w taki prosty sposb, jednak mo|na te| bardziej skomplikowanie. Je|eli chcemy doda jak[ warto[ do obecnej warto[ci np. 2 do warto[ci 5, to zamiast = dajemy +=. Podobnie jest z odejmowaniem -=, mno|eniem *=, dzieleniem /= lub u|ywajc operatorw bitowych |=, & lub ^=. Inne rodzaje zmiennych W GML mo|emy u|ywa poza tymi prostymi zmiennymi tak|e innych. Je|eli u|yjemy normalnych, to bd one przechowywane tylko w jednym objekcie. Je|eli chcemy utworzy zmienn oglnodostpn, trzeba posBu|y si tzw. globalnymi. Zmienne globalne od zwykBych r|ni si przedrostkiem global. w nazwie. Zmienna globalna mo|e wyglda tak: global.nazwa=1; Czasami jednak, chcemy, |eby zmienna byBa tylko u|ywana w jednym skrypcie, a nie do ka|dego skryptu w danym obiekcie. W takim przypadku, zmienn musimy najpierw zadeklarowa w var, a potem ustalamy jej warto[, jak w innych przypadkach. Mo|e to wyglda tak: kod: { var abc,def; abc=1; def=2; } Adresowanie zmiennych Czasami do skryptu potrzebujemy zna zmienn zadeklarowan w innym objekcie. Po przeczytaniu powy|szych informacji, ka|dy by to zrobiB na podstawie stworzenia globalnej o warto[ci tamtej. Nic bardziej bBdnego. W takich przypadkach wykorzystujemy adresowanie zmiennych. Przyjmijmy, |e chcemy zmieni warto[ zmiennej x obiektu pilka. Piszemy wtedy tak: kod: pilka.x=2; Tutaj poznajemy pierwsz metod adresowania - poprzez podanie nazwy obiektu. Nale|y pamita o kropce midzy nazw obiektu i nazw zmiennej. Mo|emy tak|e adresowa nie podajc nazwy obiektu. Wtedy piszemy: - self : obiekt w ktrym jest wykonywana akcja - other : obiekt, ktry jest w trakcie kolizji z obiektem w ktrym wykonywana jest akcja - all : wszystkie obiekty - noone: |aden z obiektw (brzmi dziwnie, ale czasami si przydaje) - global : |aden z obiektw, ale tworzy zmienn globaln (patrz poprzedni podrozdziaB) Zmienne mo|emy rwnie| adresowa, podajc id obiektu (w nawiasie), np. kod: (100032).x=250; Jednak skd bra id obiektu? Tworzc go, dostaniemy jego id, np. obiekt=instance_create(250,546,pilka); Wtedy, ju| nie podajc id, mo|emy adresowa w poni|szy sposb: kod: { obiekt=instance_create(250,546,pilka); obiekt.x=267; } Dla uBatwienia mo|na korzysta z numeracji zmiennych, gBwnie przydatne przy tworzeniu kilku obiektw (lecz mo|na to tak|e u|y do ju| gotowych obiektw) i wtedy razem z adresowaniem, bdzie to wyglda tak: kod: { obj[0]=instance_create(250,546,pilka); obj[1]=ludzik; obj[0].speed=5; obj[1].y=555; } Tablice W GML mo|na u|ywa tablic jedno i dwuwymiarowych. Tworzenie ich jest proste - poprostu wpisujemy warto[ w nawiasy kwadratowe (przy jednowymiarowych jedn liczb, przy dwuwymiarowych - liczb, przecinek i drug liczb). Tablice mog wyglda tak: kod: { a[0]=1; b[1,3]=2; } Instrukcje warunkowe, ptli itd. Instrukcja warunkowa Instrukcja warunkowa w GML ma formy: kod: if (<warunek>) <wyra|enie> lub kod: if (<warunek>) <wyra|enie> else <wyra|enie> Warunek mo|e skBada si z wielu funkcji, wtedy piszemy: kod: if (<warunek>) { <wyra|enie> } else { <wyra|enie> } Poprawnie zapisany przykBad instrukcji warunkowej wyglda tak: kod: if (x < pilka.x) { speed=5; pilka.speed=15; } else { speed=15 pilka.speed=5 } Instrukcja ptli repeat Instrukcja ptli repeat wyglda tak: kod: repeat (<warto[>) <wyra|enie> Warto[ ustala ile razy ptla ma by wykonywana i musi by podana jako liczba naturalna. PrzykBad: kod: { repeat (2) instance_create(random(400),random(400),pilka); } Instrukcja ptli while Instrukcja ptli while wyglda tak: kod: while (<warunek>) <wyra|enie> Instrukcja ta polega na tym, |e wyra|enie (nawet skBadajce si z wielu funkcji) jest wykonywane kiedy pewien warunek jest speBniony. U|ywajc jej trzeba uwa|a, poniewa| mo|na zaptli co[ w nieskoDczono[ przez co gra mo|e si zawiesi. PrzykBad: kod: { while (!place_free(x+32,y+32)) instance_create(x+32,y+32,pilka); } Instrukcja ptli do Instrukcja ptli do wyglda tak: kod: do <wyra|enie> until (<warunek>) Wyra|enie zawarte w tej ptli (nawet skBadajce si z wielu funkcji) jest wykonywane tak dBugo, a| warunek zawarty w until bdzie wykonany. U|ywajc jej trzeba uwa|a, poniewa| mo|na zaptli co[ w nieskoDczono[ przez co gra mo|e si zawiesi. PrzykBad: kod: { do instance_create(random(600),random(600),pilka) until instance_number(pilka)=100; } Instrukcja ptli-warunkowa for Instrukcja ptli-warunkowa for wyglda tak: for (<wyra|enie1>; <warunek>; <wyra|enie2>) <wyra|enie3> Wyglda skomplikowanie, nieprawda|? Jednak to bardzo proste. Wyglda to mniej wicej tak: - wyra|enie1 jest wykonywane; - warunek jest sprawdzany; - je|eli jest prawdziwy, wyra|enie3 jest wykonywane; - potem wyra|enie2; - potem znowu od pocztku, a| warunek bdzie faBszywy. Je|eli nie rozumiesz, to pomy[l tak. Wyra|enie1 inicjuje ptle for. Warunek sprawdza, czy ptla ma by zakoDczona. Wyra|enie2, to takie "przecignicie" ptli, ktre jest sprawdzane za ka|dym nastpnym razem po wykonaniu wyra|enie1. Najpopularniejszym przykBadem wykorzystania for jest tworzenie licznika z pewnym przedziaBem liczbowym. PrzykBad: kod: { for (i=0; i<=9; i+=1) list[i] = i+1; } Inne instrukcje i wyra|enia Instrukcja switch Instrukcja switch wyglda tak: kod: switch (<warunek>) { case <warunek1>: <wyra|enie1>; ... ; break; case <warunek2>: <wyra|enie2>; ... ; break; ... default: <wyra|enie>; ... } DziaBa to tak: - warunek jest sprawdzany; - sprawdzane s pozostaBe warunki; - je|eli jeden z warunkw jest speBniony, wyra|enia s wykonywane, a| do wystpienia break; - je|eli |aden warunek nie jest speBniony, jest wykonywane wyra|enie w default (nie jest wymagany). Mo|na te| korzysta z tzw. multiple case (wielokrotnych case). Wtedy kolejny case dajemy w miejsce wyra|enia. Tak|e break nie jest potrzebny. Je|eli nie ma break, to kod po prostu jest wykonywany dalej. PrzykBad: kod: switch (keyboard_key) { case vk_left: case vk_numpad4: x-=4; break; case vk_right: case vk_numpad6: x+=4; break; } Wyra|enie break& ~ F4L(Td r,,.../ 2N284d477:4;>AtAxAAGGRSSnUUVW.]@]_`4cTcnnssxUh]V5>*\h]V h]V5\7| " ` T#^#t#(&(F())*++n,p.z..d/n////gd]V/0000v112222334444466~777:8::D::@@:AAgd]VAACFFG>RHRTR&T0TBTUUUWW0Xbb0ceee|gggphzhhgd]V Wyra|enie break wyglda tak: kod: break W przypadku u|ycia tego kodu z ptlami, bdz instrukcj for lub with, zakoDczy dan ptl lub wyra|enie. Je|eli jest u|yty poza nimi, koDczy dziaBanie programu (nie koDczy gry). Wyra|enie continue Wyra|enie continue wyglda tak: kod: continue W przypadku u|ycia tego kodu z ptlami, bdz instrukcj with, bdzie kontynuowa dziaBanie kodu z nastpn warto[ci dla ptli lub instrukcj with. Wyra|enie exit Wyra|enie exit wyglda tak: kod: exit Wyra|enie to po prostu koDczy dziaBanie skryptu. (Nie koDczy ono dziaBania gry! Jak chcesz zakoDczy gr, musisz u|y funkcji game_end();). Funkcje Funkcja skBada si z nazwy funkcji po ktrej s podane arguments w nawiasie, rozdzielane przecinkami. kod: <funkcja>(<argument1>,<argument2>, ...); W Game Makerze mamy dwa typy funkcji. Pierwsze, to spora kolekcja wbudowanych funkcji, do kontrolowania wszystkiego co si dzieje w grze. Drugi typ to ka|dy skrypt zdefiniowany przez ciebie (w zakBadce scripts). Mo|emy ich tak|e u|ywa jak funkcje. Musisz pamita, |e jak nie wpisujemy do funkcji arguments, to zostawiamy nawiasy! Niektre funkcje zwracaj warto[ci (np. variable_global_exists(nazwa);) i mog by wtedy u|ywane jako wyra|enia. PozostaBe wykonuj po prostu polecenia. Tak|e musisz pamita, |e funkcje nie mog by adresem zmiennej. Je|eli ju|, to zapisujemy funkcj w nawiasie np. (instance_nearest(x,y,obj)).speed=0;. Arguments Tworzc skrypty, mo|esz zaimplementowa do nich arguments. S one przechowywane w zmiennych argument0, argument1...argument15. W Game Maker mo|emy zaimplementowa a| do 16 arguments (w przypadku korzystania z tzw. klocka, mo|emy zaimplementowa tylko 5 argumentw). Skrypty z arguments uruchamiamy na wzr funkcji (patrz wy|ej). Zwracanie warto[ci przez skrypt Wcze[niej pisaBem o tym, |e funkcje mog zwraca pewn warto[ jak rwnie|, |e skrypty zdefiniowane w zakBadce scripts, to te| funkcje. Wic teraz, jak tworzy zwracanie warto[ci przez skrypt? To proste. Wykorzystujemy wtedy instrukcj return, ktra wyglda tak: return <wyra|enie> Trzeba pamita, |e return automatycznie koDczy dziaBanie skryptu! PrzykBad: kod: { return (argument0*argument0) } Konstrukcja with Jak ju| pisaBem wcze[niej, mo|liwe jest ustalanie lub sprawdzanie warto[ci zmiennej zawartej w innym objekcie, czyli tzw. adresowanie. Dla przykBadu, chcesz |eby wszystkie obiekty pilka przesunBy si o 8 pikseli w gr. Zgodnie z tym co napisaBem wcze[niej, bdziesz my[laB, |e mo|na to zapisa tak: kod: pilka.y = pilka.y + 8; Jednak jest to zapis nieprawidBowy. Dlaczego? Ot|, bdzie pobrane poBo|enie Y jednej z piBek i dodane do niego 8. Zajdzie taki proces, |e w koDcu, wszystkie piBki bd w tej samej lini. Te| wyra|enie kod: pilka.y += 8; doprowadzi do tego samego efektu. Wic co robi? Wtedy korzystamy z instrukcji with. Wyglda ona tak: kod: with (<wyra|enie>) <polecenie> <wyra|enie> to obiekt na ktrym ma by wykonywane polecenie. Mo|esz tam da id obiektu lub jego nazw (je|eli wszystkie maj zareagowa). Mo|na te| u|y jeden ze "specjalnych" obiektw (all, self, other, noone). <polecenie> jest wykonywane dla wszystkich obiektw z osobna, co zapobiega takim bBdom jak powy|ej. Wic, jak chcesz przesun piBki o 8 pikseli w dB, to mo|esz u|y kod: with (pilka) y+=8; Mo|esz te| korzysta z kilku poleceD na raz. Wtedy dla przykBadu, |eby przesun ka|d piBk w losow pozycj damy: kod: with (pilka) { x=random(room_width); y=random(room_height); } PozostaBe przykBady wykorzystania tej instrukcji znajdziesz w pliku pomocy Game Makera (dokumentacji) w: The Game Maker Language (GML) -> GML Language Overview -> With construction. Komentarze Teraz co[ prostego i u|ytecznego, ale zrozumiaBego tylko dla programisty :-) . Pomwmy teraz o komentarzach. Wic, wszystko w linii napisane po // nie bdzie odczytywane przez program np. kod: x = 25 // x = 44 - to ju| nie jest odczytywane przez program Jednak, jak przejdziemy do nastpnej linii, to komentarz ju| nie bdzie dziaBaB. Co robi, jak chcemy mie komentarze wieloliniowe? Jest to prosta rzecz. Dajemy wtedy tekst midzy /* i */. PrzykBad: kod: x+=44 /* if x=0 { show_message('tego program nie przeczyta'); } */ show_message('ale to ju| program przeczyta'); Nie wierzysz? Sprawdz. Porady dotyczce dalszej nauki - Nie bj si zaglda do pliku pomocy. ZostaB on napisany po to, |eby[ mgB Batwo i szybko znalez odpowiedni funkcj. Wystarczy po odpaleniu tzw. helpa wej[ w Wyszukaj lub Indeks i wpisa po angielsku co nas interesuje, np. gdy chcemy poszuka funkcji zwizanych z rysowaniem, wpisujemy w Indeks draw i pojawia nam si spis funkcji. Wtedy wystarczy klikn dwukrotnie i odpali nam si rozdziaB gdzie mamy opisane to co nas interesuje. Je|eli nie umiesz angielskiego na przynajmniej [rednim poziomie, zajrzyj do sBownika. Opisy zazwyczaj s krtkie, przez co ich tBumaczenie nie powinno zaj du|o czasu. - Je|eli nie umiesz zrobi jakiej[ rzeczy, nie martw si. Osobi[cie polecam metod prb i bBdw, w koDcu dotrzesz do rozwizania problemu. Jak ju| na prawd nie masz pomysBw, przeszukaj artykuBy i przykBady na naszej stronie lub na oficjalnej stronie Game Makera. Jest to prawdziwa skarbnica wiedzy o tworzeniu gier. Zawsze te| mo|esz przeszuka forum, ew. si na nim zapyta, ale pamitaj: obowizkiem forumowiczw nie jest odpowiadanie na pytania. Je|eli odpowiadaj, to tylko z wBasnej, dobrej woli, dlatego nie powiniene[ by bardzo nachalny. - Piszc skrypty, zawsze mo|emy si posiBkowa podpowiedziami. Pod miejscem gdzie piszemy kod, jest taki szary prostokt. Pojawiaj si tam funkcje, zmienne itd. ktre odpowiadaj temu co zaczBe[ pisa, np. piszc draw_tex, pojawi si tam draw_text(x, y, string). Czasami jest to bardzo pomocne, szczeglnie gdy piszemy skrypty z pamici bez posiBkowania si plikiem pomocy. - GMLa, tak jak ka|dego innego jzyka skryptowego/programowania nie da si nauczy w jeden dzieD i sdzi |e si wszystko umie, tylko po przeczytaniu pomocy. Najwa|niejsza jest praktyka. Czasami nawet piszc du|o skryptw i posiBkujc si plikiem pomocy mo|na si wicej nauczy ni| tylko czytaniem go. Dlatego, powtrz jeszcze raz - korzystaj z metody prb i bBdw. Jest to najlepszy sposb, |eby si nauczy dobrze jzyka. Spis przydatnych wiadomo[ci przy pisaniu skryptw - Kiedy chcemy ustawi alarm na konkretn ilo[ sekund, nie strzelaj nigdy. Alarmy s w tzw. stepach. Jest to zale|ne od szybko[ci rooma (room speed). Domy[lnie wynosi ona 30, wic idc drog domysBu, 30 stepw to 1 sekunda. Jednak, je|eli nie chce nam si liczy albo nie mamy domy[lnej warto[ci, warto skorzysta ze zmiennej room_speed. Przechowuje ona informacje o szybko[ci rooma. Wtedy mo|emy ustawi alarm wpisujc tak: room_speed*<ilo[ sekund>. PrzykBadowo, po wpisaniu room_speed*5 alarm bdzie wykonany po 5 sekundach. - Staraj si u|ywa jak najmniej zmiennych, jak najcz[ciej korzysta z arguments oraz ogranicza ilo[ eventw do minimum. Na przykBad, zamiast tworzy eventy do poszczeglnych klawiszy, lepiej napisa w step odpowiedni konstrukcj if. - Zamiast tworzy sprite i da mu animacj gdzie si obraca o 360 stopni, lepiej zastosowa zmienn image_angle. Wtedy tworzymy jeden sprite zwrcony w prawo i obracamy go. Korzystanie z image_angle wyglda tak: image_angle=<stopnie>. PrzykBadowo, gdy chcemy obrci sprite o 240 stopni wpisujemy: image_angle=240. Mo|na te| to miesza z innymi zmiennymi/funkcjami w ktrych dane s zapisane w stopniach, np. image_angle=direction. - Jak chcesz sprawdzi czy skrypt nie zawiera bBdw, nie odpalaj gry. Szybciej jest sprawdzi naciskajc na Check the script for syntax errors. Oczywi[cie sprawdza on tylko skBadni i poprawno[ napisania funkcji, zmiennych czy nazw, to warto z niego korzysta. Ewentualnie mo|na uruchamia gr w Debug Mode (czerwona ikonka obok Run Game). hkkkllRmPpZppdrnrPsgd]V ,1h. A!"#$% D@D NormalnyCJ_HaJmHsHtHJA@J Domy[lna czcionka akapituPi@P  Standardowy4 l4a ,k@, Bez listy>>ChUZq  0 # 78=SBG{NSrX]{uz"zotch   !!!!!!""#b(g(()))***(+-+L+,,,V-[--//Z/"0'00>0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>ChUZq  0 # 78=SBG{NSrX]{uz"zotch   !!!!!!""#b(g(()))***(+-+L+,,,V-[--//Z/"0'00>{0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y0y08$/Ah%'(H& PYosty#,./35=>B %DHINmoqx}/ 7     .3rx  ace{ '*>>>>>>>AUX   gu8;BEGI NQSYX[]b<Sux 0=or-2Y^dkcfhn    !!!!!!!!a"k""""""#q##& &b(e())))))))))********(+++-+1+\+l+++",+,,,,,V-Y-[-_-....////Y/011q2v224:4556627;709;9=#===>>C RbL[o^%" #BRbLo a8F [8m RbL RbLP RbL2H W!RuRbLLGRbLa "RbL}#qsQ>!$RbL$ 0:F$RbL^%RbL1&'<(6'RbL'<(RbLn*)>VP*RbLV7,RbL 0RbL|r2RbL12RbL0?3JW[8RbL a8RbL9;zuWT-: Q:\U.;RbL^;!$*"<12qsQ>RbL)>RbL$?RLi_?RbL#B6'Q )D!RuERbLg hGa "RbLRLRbL(`ORP ZbUVP*\URbLxUEWRbLJWRbL;zuWRbLj?XA/ \bowY|r2A/ \RbL _V7,lb9?|)GbRbL1cm Jf:F$Mhk.;wtrLGt)Gb1ui_?z#B9?|RbL]V@>>Ge>>L>@@*@,@2@4@RUnknownGz Times New Roman5Symbol3& z Arial"15 r5 r%4>>LP(?]V2DamianDamianOh+'0X    ,8@HPDamian Normal.dotDamian2Microsoft Office Word@@lp@lp5՜.+,0 hp|  DOMr >  Tytu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIKLMNOPQRSTUVWXYZ[\]^_`bcdefghjklmnopsRoot Entry Fwpu1TableJ,WordDocument.SummaryInformation(aDocumentSummaryInformation8iCompObjz  F(Dokument programu Microsoft Office Word MSWordDocWord.Document.89q