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
2023.11.1.129 • 2023.11.1.160
wydana 69 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 128 dni temu
Beta
2024.200.0.499 • 2024.200.0.516
wydana  wczoraj
= IDE, = Runtime
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
38 użytkowników online na discordzie:
LadyLush❄, 🧁Cupcake🧁, DungeonFairy🧚, OdrzuconyKrakers, s..., Alice, Nitro Slav, Carl-bot, Dominator2v, Kowu, m..., YoungKrystian, r..., Uzjel, lethian, HappyOrange, Moldis, Arrekin, Jayu, LeD, Domeen0, Dyno, Deusald, Korodzik, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, blackamul, m..., bagno, Tidżi, Mtax, g..., Alkapivo, moeglich, Krzysiek1250, Shockah, Kandif, Cosplyfanka, exigo
Shoutbox
gnysek (10:49, 20.02.24)
Ja czekam na pluginy do IDE, czego YYG nie zrobi, zrobimy sami.
Adriann (11:50, 16.02.24)
Ciekawe jak go przerobią, osobiście liczę na jakąś większą rewolucję a nie tylko usprawnienie bo narazie jest jak jest :d
gnysek (10:32, 08.02.24)
Edytor roomów ma swoje minusy. Ale ma być tworzony nowy wkrótce, chociaż pewnie 6-12 miesięcy zanim trafi do wersji stabilnej jak nic.
p
pablo1517 (08:40, 07.02.24)
No ja odkąd zacząłem w ue4 pracować to niestety z GMLem dawno nie obcowalem
exp (20:13, 30.01.24)
@pablo1517 ja przerzuciłem się z klasycznego GM na Studio cztery lata temu, więc przeskok trochę mniejszy, ale generalnie idea dużo się nie zmieniła. jest trochę upierdliwości i niepotrzebnych według mnie zmian, ale też duże usprawnienia (edytor roomów to raj na ziemi w porównaniu z tym oryginalnym)
Adriann (18:59, 28.01.24)
Takk..strasznie są upierdliwe :D
I am Lord (17:08, 28.01.24)
Mniej czasu się straci tworząc system particli z kodu od zera niż się męczyć z importem ich z edytora, 🤦‍♂️🤦‍♂️
I am Lord (16:56, 28.01.24)
Co jest nie tak z tymi particlami z IDE, masakra jakaś. Ile to trzeba kombinować żeby użyć je prosto z kodu
p
pablo1517 (17:57, 27.01.24)
Czyli GML nie dostał jakiś drastycznych zmian?
gnysek (14:47, 26.01.24)
Czy ja wiem... generalnie zamysł ten sam, tylko IDE nieco inne.
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?