GMS 2.3 - funkcje, kontstruktory, klasy, dziedziczenie, lekkie obiekty

Piątek, 31 Stycznia 2020, 15:55
Czas czytania 3 minuty, 19 sekund
Zgodne z GM: gms2
Opis wielu nowych funkcjonalności dotyczących funkcji w GMS 2.3.
GMS 2.3 zmienia dotychczasowe działanie skryptów.

Kiedyś definiowało się np. scr_leading_zero(); (np. funkcja dodająca zera poprzedzające do liczby) i wstawiało kod:
kodreturn string_repeat("0", max(0, argument1 - string_length(string(argument0)))) + string(argument0);
Ale od nowej wersji, gdzie wprowadzono funkcje, nie ma już skryptów, więc tę samą funkcjonalność zapisujemy tak:

kodfunction scr_leading_zero(a, b) {
return string_repeat("0", max(0, a - string_length(string(b)))) + string(argument0);
}

Wskazówka:
GM 2.3 sam przekonwertuje skrypty na funkcje. Ponieważ argument0...argument15 nie jest już używane przez skrypty, w trakcie konwersji tak zostaną nazwane nasze argumenty funkcji, co pozwala nie utracić funkcjonalności. Nadal natomiast działa argument_count i argument[n] dla uzyskania "opcjonalnych" argumentów.


GLOBALNY ZASIĘG

Co ważne, od wersji 2.3 wszystko co wpiszemy w skryptach, wykona się w trakcie inicjacji gry (przed pierwszą klatką), w zasięgu globalnym (tak jakby w ramach global.). Każda zmienna więc stanie się globalna.

I tak, w GMS 1.0 - 2.2 mogliśmy uzyskać globalną zmienną bez prefixu global. za pomocą (nie dało się nadać od razu wartości, w przeciwieństwie do var):
kodglobalvar NAZWA; NAZWA = 1;Od wersji 2.3 możemy napisać w skrypcie:
kodNAZWA = 1;I zmienna już będzie globalna. Oczywiście można nadal używać global.


Stałość funkcji
GMS 2.3 pozwala tworzyć funkcje anonimowe (lambda), które można przypisać do zmiennej. Dzięki temu, funkcja może być elementem tablicy, struktury ds_xxx, czy nawet przypisana do zmiennej tymczasowej i znika z pamięci, gdy zniknie przypisanie do zmiennej/elementu struktury/tablicy (skasowanie lub zmiana wartości).

Oznacza to, że pisząc:
kodfunction a() {return 1;}W całej grze nie można już używać zmiennej pod nazwą "a" w obiektach/funkcjach, gdyż jest to identyfikator funkcji (można go np. użyć do script_execute).
koda = function() {return 1;}Przypisanie jednak funkcji do zmiennej (wtedy nie podajemy już nazwy), powoduje, że możemy tą samą zmienną nadpisać potem czymś innym (liczba, string, inna funkcja). Wciąż można użyć script_execute, ale napisanie a = 1; usunie funkcję z pamięci.


Konstruktory - namiastka klas w GMS 2.3

Jeżeli chcielibyśmy skorzystać z funkcjonalności podobnej do struktur, i przetrzymywać w niej dane, ale nie umożliwiać już tak dynamicznego dodawania elementów, można stworzyć konstruktor funkcji w innych językach nazywany klasą.

Należy wtedy przed nawiasem klamrowym[b] dodać instrukcję [b]conctructor. Dozwolona jest oczywiście przemienność, powodująca możliwość nadpisania.

kodclass_a = function() constructor() {};
function class_b() constructor {};

Oczywiście w takiej "klasie" można wstawiać kolejne funkcje, tablice i struktury.

kod
Vector2 = function(_x, _y) constructor {
x = _x;
y = _y;
static Add = function( _other ) {
x += _other.x;
y += _other.y;
}
};
a nowy egzemplarz takich funkcji tworzymy z pomocą instrukcji new:
kodvar a = mystruct();
var b = Vector2(5,10);
Wskazówka:
Instrukcja static oznacza, że dana funkcja będzie współdzielona, zamiast nowa jej instancja tworzona wraz z każdą nową instancją struktury


Funkcje-konstruktory mogą też dziedziczyć po innych funkcjach-konstruktorach - służy do tego znak dwukropka:
kodfunction Vector3(_x, _y, _z) : Vector2(_x, _y) constructor {
z = _z;
static Add = function( _other ) {
x += _other.x;
y += _other.y;
z += _other.z;
}
};
Można wtedy napisać:
kodvar v1 = new Vector3(10, 10, 20);
var v2 = new Vector3(100, 100, 200);
v1.Add( v2 );
show_debug_message(v1);

Funkcje z konstruktorem przypominają więc struktury (albo struktury zwracane funkcją), ale pozwalają na nieco więcej opcji, z drugiej strony ograniczając swoją strukturę początkową definicją.

Zwykła struktura przypomina więc bardziej JSONa, a funkcje - klasy.
Komentarze (łącznie 1):
Uzjel (Pią., 31 Sty. 20, 16:49)
#1

Tyle zmian, że nie wiadomo jak teraz projekty przerabiać :)

Najnowsze wersje GameMakera:

Stabilna
2024.4.1.152 • 2024.4.1.202
wydana 28 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 246 dni temu
Beta
2024.600.0.576 • 2024.600.0.602
wydana  5 dni temu
= IDE, = Runtime
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
Shoutbox
gnysek (14:15, 17.06.24)
Bo Łapusz woli alkohol, niż się organizować. Co tam Pixel Heaven, sprawdźcie jego zbiórki na książki...
Adriann (21:02, 13.06.24)
Bardzo słusznie, straszna patola z tą organizacją :D
I am Lord (08:35, 13.06.24)
Ale co jak co, zrobiło się o imprezie głośno.
I am Lord (08:35, 13.06.24)
No słyszałem już że drama była :D
gnysek (19:58, 10.06.24)
Po 16-17 każdemu :)
Tymon (18:19, 10.06.24)
To komu udało się wejść na PH?
gnysek (13:35, 03.06.24)
Przypominam, ze w sobotę i niedzielę na Pixel Heaven się mozemy zobaczyc
Wojo (03:18, 30.05.24)
gmclan wiecznie żywy
gnysek (10:09, 21.05.24)
Ale z jakimi błędami...
I am Lord (09:52, 20.05.24)
o piszą o nas 😁
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?