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.11.0.179 • 2024.11.0.227
wydana  2 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 18 dni temu
Beta
2024.1100.0.713 •
2024.1100.0.726
 0.14.0

wydana 10 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
37 użytkowników online na discordzie:
🧁Cupcake🧁, Alice, Carl-bot, Wielki Druid, Kowu, LadyLush, GMRussell, fervi, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, Kalor, PhysX ᴺⱽᴵᴰᴵᴬ, r..., antek, HappyOrange, Arrekin, Rozen, MagnusArias, yazaa, Domeen0, Dyno, szmalu, LeD, ZYGZAK, Miłosz, blackamul, Ulti, bagno, Sporek, Danieo, Mtax, Huder, l..., moeglich, s..., Add92, Shockah, PeekoHiko
Shoutbox
Uzjel (20:17, 10.12.24)
Cały ruch przeniósł się na Discorda.
MagnusArias (17:43, 01.12.24)
O matko... a ja tutaj jestem od ponad 15 lat i czasami zaglądam... biernie bo biernie, ale czasem wpadnę
gnysek (11:46, 17.11.24)
Witamy, witamy!
baca (12:22, 16.11.24)
To już 25 lat.. Witam po paru latach nieobecności.
gnysek (11:05, 15.11.24)
Natomiast obecne forum istnieje od 2004, jak z iglu.cz na gmclan.org przeszliśmy i od tego czasu nie było resetów danych.
gnysek (12:35, 13.11.24)
Ogólnie GMCLAN istnieje 22 lata, ale na to trofeum nie zrobiłem (jeszcze xD)
Chell (20:41, 08.11.24)
wow, ta emotka w ogóle nie wygląda jak : O xD
Chell (20:40, 08.11.24)
tylko? :O 4tk ma 15
Borek (18:12, 07.11.24)
Właśnie dostałem powiadomienie z forum, że jestem na GMClanie 18 lat :D Ja pierdzielę...
S
Sutikku (08:43, 18.10.24)
TIL, gamemaker jest starszy ode mnie
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?