Game Maker Language
Pojawienie się |
1999 |
---|---|
Twórca | |
Licencja |
zamknięta |
Strona internetowa |
Game Maker Language (w skrócie: GML) – język skryptowy stworzony na potrzeby programu do tworzenia gier Game Maker. Został stworzony przez Marka Overmarsa jako suplement systemu "przeciągnij i upuść" dostępnego od pierwszych wersji programu. W późniejszych wersjach system "przeciągnij i upuść" jest już tłumaczony bezpośrednio do GML, jest więc jego graficzną formą. Poza kilkoma czynnikami zarządzanymi bezpośrednio przez silnik GameMakera (kolejność wykonywania i wywoływanie zdarzeń, kolejność plansz) pokrywa wszystkie możliwości programu i jest sporym rozszerzeniem systemu przeciągnij i upuść, który pokrywa tylko nieznaczną część dostępnych funkcji.
GML może być używany w: akcjach obiektów, skryptach, liniach czasu, kodzie tworzenia planszy, rozszerzeniach oraz w kodzie tworzenia instancji na planszy.
Biblioteki
[edytuj | edytuj kod]W GameMakerze, zestaw akcji (klocków) systemu przeciągnij i upuść nazywany jest biblioteką akcji. Akcje są wyświetlane w oknie edycji obiektów, w zakładkach, jako kwadratowe ikony. GameMaker posiada dostępnych kilka standardowych bibliotek wystarczających początkującemu użytkownikowi, można jednak tworzyć własne zestawy - w praktyce jest to jednak mało praktyczne, gdyż bardziej rozbudowane gry stają się trudne do zarządzania, gdy akcji jest dużo. W praktyce, średnio zaawansowany użytkownik korzysta głównie z akcji "wykonaj kod" w której może bezpośrednio wpisywać funkcje. Bibliotek nie należy mylić z bibliotekami DLL.
Składnia
[edytuj | edytuj kod]Składnia GML przypomina C oraz Pascal (GameMaker jest napisany w Delphi). W wielu miejscach jednak różni się od tych języków, lub łączy ich zachowania (np. można zamiennie używać begin
i {
, oraz }
i end
). Przypisywanie wartości nie jest wyrażeniem zwracającym wartości, dlatego nie może być używane w instrukcjach warunkowych.
Poza przypisywaniem za pomocą znaku równości i operacjami matematycznymi jakie mogą za tym znakiem zajść, GM dopuszcza składnię w postaci =
, -=
, *=
, oraz /=
. Nie można jednak używać operatora trójargumentowego (?:
). Znaki średnika można używać do rozgraniczania kolejnych wyrażeń, ale ich brak nie jest uznawany za błąd.
Funkcje
[edytuj | edytuj kod]GameMaker posiada kilkaset wbudowanych funkcji. Dodatkowo, użytkownik może tworzyć własne funkcje (skrypty). Funkcje używane do rysowania korzystają z API Direct3D.
Język pozwala na korzystanie z zewnętrznych funkcji oferowanych przez biblioteki DLL.
Zmienne
[edytuj | edytuj kod]Zmiennych w GameMakerze nie trzeba definiować, są one tworzone poprzez pierwsze przepisanie na zasadzie zmienna = wartosc
.
GML posiada dwa typy zmiennych - łańcuch tekstowy (string) oraz liczby rzeczywiste (real). Typ zmiennej zostaje ustalony przy przypisaniu wartości (typ może się więc zmieniać w trakcie), nie można jednak porównywać dwóch typów zmiennych - jest więc to typowanie silne. Język nie posiada typów boole'owskich (true/false), tak więc za prawdę przyjmuje się każdą wartość >= 0.5, za fałsz wartości < 0.5;
Duża liczba zmiennych i stałych jest w język wbudowana. Część zmiennych jest lokalna dla każdej instancji obiektów (jak "x" czy "speed"), część jest wspólna i globalna (jak "score"), a część jedynie do odczytu (jak "fps"). Stałe są zawsze dostępne globalnie.
Użytkownik może definiować własne stałe, zmienne globalne (poprzedzając je przy użyciu prefiksem global., lub bez niego jeśli wcześniej zadeklaruje listę po wyrażeniu globalvar), zmienne lokalne (w obiektach, po prostu przypisując im wartość), oraz zmienne tymczasowe (w każdym fragmencie kodu, o zasięgu danego bloku, definiując listę za słowem var). Jeśli z bloku wykonywany jest kod dla innego obiektu, to ma on dostęp do zmiennych tymczasowych, ich zasięg jest więc globalny (GM ma tylko jeden wątek, więc nie powoduje to konfliktów).
Istnieją dwa typy tablic - jedno i dwu wymiarowe. Tablice mogą zawierać mieszankę tekstu i liczb, ale nie mogą zawierać kolejnych tablic. Tablice nie mogą być też przekazywane jako referencje do funkcji. Maksymalny indeks tablicy to 31999, a maksymalna pojemność to 1.000.000 elementów. Poza tradycyjnymi tablicami istnieją też struktury danych: listy, kolejki, stosy, mapy, siatki, kolejki priorytetowe.
Zasięg
[edytuj | edytuj kod]Kod może być wykonywany względem aktualnej instancji, lub innej instancji. Cały skrypt może mieć narzucone wykonywanie względem innej instancji za pomocą specjalnego przełącznika w edytorze danego skryptu, lub za pomocą wyrażenia with
. Od tego zależy z którego zasięgu brane będą zmienne. GameMaker automatycznie przypisuje do wyrażenia other
referencję na obcą instancję w przypadku kolizji, oraz gdy wykonywany kod jest wywoływany z innej instancji:
/* zwrot obiektów innyObiekt zostanie ustawiony na taki sam, jak instancji z której kod wywołano */
with (innyObiekt) { direction = other.direction }
Zarządzanie pamięcią
[edytuj | edytuj kod]GameMaker sam zarządza pamięcią i usuwa zmienne które zostały ustawione w danej instancji w momencie jej niszczenia. Nie są jednak usuwane zasoby które dostępne były przez referencję, tzn. jeśli dodaliśmy do gry grafikę i jej referencja została przypisana do zmiennej w instancji obiektu, to jego zniszczenie powoduje jedynie usunięcie zmiennej, a nie grafiki przypisanej przez tę referencję. To samo dotyczy struktur danych - jeśli zgubimy referencję, struktura nadal istnieje w bazie. Referencje to kolejne liczby naturalne (licznik nie cofa się w przypadku usuwania zasobów, taka referencja po prostu zwróci błąd nieistniejącego zasobu), dla każdego typu zasobu/struktury danych istnieje osobny licznik.
Przykłady kodu
[edytuj | edytuj kod]Napis "Hello World" w wyskakującym oknie komunikatu:
show_message('Hello World');
Przesunięcie instancji obiektu którego referencją jest obiekt "pilka" o 4 piksele w prawo:
pilka.x =4;
Wykonanie kroku do punktu 250,100 (względem planszy) o 4 piksele:
move_towards_point(250, 100, 4);
Ta sama funkcja, omijająca obiekty oznaczone jako solidne:
mp_potential_step( 250, 100, 4, false);
Przykład komentarza jednoliniowego:
// komentarz jednoliniowy
Przykład komentarza wieloliniowego:
/*
komentarz
wieloliniowy
*/
Ustawienie przeźroczystości instancji obiektu:
image_alpha=0.5;
Pętla "for":
for (i=0; i<5; i )
{
<wyrażenie>
}
Tworzenie instancji obiektu "ludzik":
instance_create_depth(x, y, depth, ludzik);
Przeskoczenie obiektu o 24 piksele:
if keyboard_check_pressed(vk_left)
x-=24;