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.2.0.132 • 2024.2.0.163
wydana 46 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 185 dni temu
Beta
2024.400.0.543 • 2024.400.0.562
wydana  2 dni temu
= IDE, = Runtime
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
Shoutbox
gnysek (20:44, 11.04.24)
Niektórzy dlatego wybierają GMEdit. Ale ja liczę na Code Editor 2, tylko na razie zbyt zbugowany jest.
Tymon (16:11, 11.04.24)
Stitch dla mnie osobiście jest lepszy bo nie musze kopać się z interfejsem GMa i mogę tylko pisać kod.
Tymon (16:05, 11.04.24)
Yes. Obecny nie jest taki zły, jak zainstalowałem najnowszą stabilną to w porównaniu z tym czego używałem... 10 lat temu...? Wszystko wydaje się lepsze.
gnysek (22:48, 10.04.24)
bscotch/stitch ? Ja czekam na fixy do nowego edytora, bo wszystko wydaje się dziś lepsze od tego obecnego :D
Tymon (19:54, 10.04.24)
Hm, Stitch okazuje się całkiem dobrą alternatywą dla wbudowanego edytora
Wojo (22:16, 08.04.24)
siemano huder myślałem, że zniknąłeś całkiem z gmclanu bo na discordzie cie nie ma :D
I am Lord (00:37, 05.04.24)
O dzięki :D
gnysek (09:58, 02.04.24)
Znalazłem na podstawie jego postów: youtube.com/@Jakim_
I am Lord (20:16, 01.04.24)
Ktoś ogarnia jakie konto miał Jakim na YT?
gnysek (16:07, 29.03.24)
Nowy Edytor kodu jednak po świętach
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?