Akcesory - listy, mapy, gridy, structy, tablice
Wtorek, 08 Listopada 2022, 15:24
Czas czytania 4 minuty, 36 sekund
Zgodne z GM:
Sposób na znacznie łatwiejszy - a także bezpieczniejszy - odczyt danych z list, map, gridów, struktur i tablic.
GameMaker posiada kilka nietypowych elementów składniowych umożliwiających dostęp do list, map, gridów, struktur i tablic, które nie tylko ułatwiają ich odczyt dzięki krótszemu zapisowi, ale też pozwalają na uniknięcie wyświetlenia ekranu błędu.
Wskazówka:
Przed wydaniem 2.3 GameMaker Studio, wiele funkcji ds_ powodowało błąd krytyczny, jeśli dany wpis nie istniał w strukturze. Obecnie jednak zwracają one typ
Mapy - [# key]ds_map to nic innego jak tablica haszy, gdzie kluczami mogą być nie tylko liczby, ale też tekst.
Odpowiedniki składni za pomocą akcesorów to:
Listy - [| index]Listy są bardzo podobne do tablic, ale posiadają opcję znajdywania pozycji na której jest dana wartość, czy pomieszania elementów.
Odpowiedniki składni za pomocą akcesorów to:
Wskazówka:
Od wersji 2022.11 GameMakera, tablice posiadają nowe funkcje (znajdywanie elementu, sortowanie) które pozwalają zbliżyć je do list, jeśli nie potrzebujemy losowania warto korzystać z tablic, ponieważ są zbierane przez garbage collector
Gridy - [# x, y]Gridy są bardzo podobne do tablic 2D, ale posiadają opcję ustawiania/zbierania danych z obszarów (prostokąt, koło).
Odpowiedniki składni za pomocą akcesorów to:
Wskazówka:
Jeśli wyjdziemy poza rozmiar grida, w konsoli "Ouput" GMa zobaczymy komunikat
Struct - [$ property]Struktury są "lekkimi obiektami", konterem pozwalającym przetrzymywać dane. Poza notacją struct.property, możemy też odczytywać dane za pomocą akcesorów:
Pobieranie
Jak już wspomniałem, struktury są lekkimi obiektami - dlatego też, powyższa składnia działa także dla instancji obiektów:
Pobieranie
Wskazówka:
Dzięki temu, że [$ ] pozwala na ustawienie dowolnego tekstu, możliwe jest tworzenie zmiennych ze spacjami możliwych do odczytania tylko przez akcesory i funkcje "variable_".
Tablice - [@ index]Wskazówka:
Dotyczy wszystkich wersji GameMakera przed 2022.1, a nowszych jedynie, jeśli w opcjach projektu zaznaczymy checkbox "Copy on write"
W przypadku mechanizmu "copy on write" GameMaker nie modyfikuje tablic przekazanych do funkcji, a tworzy ich kopie i zmienia dane w nich, np.
kodfunction change_array(array) {
array[0] = 1; // tworzy kopię tablicy array jako ukrytą "tymczasową" zmienną i to jej ustawia wartość 1
return array;
}
var b = change_array([0]);
show_debug_message(a); // zwraca [0]
show_debug_message(b); // zwraca [1]
Aby w tym przypadku zmodyfikować oryginalną tabloicę, należałoby napisać:
kodarray[@ 0] = 1;
Warto zaznaczyć, że jeśli nie zmieniamy tablicy w funkcji, to return zwróci nam oryginalną tablicę. Trzeba więc uważać, bo kod taki jak:
kodfunction change_array(array) {
if (irandom(1) == 0) {
array[0] = array[0];
}
return array;
}Losowo zwróci nam raz referencję do tej samej tablicy, a raz jej kopię. Stąd też w nowszych wersjach zrezygnowano z tego mechanizmu, gdyż stawia on pułapki dla nieświadomych początkujących programistów, a wprowadzono funkcję array_copy().
Łańcuchowe kojarzenie akcesorów (GM 2.3+)Nic nie stoi na przeszkodzie, aby jeden typ danych wstawiać w inny, a potem odczytywać go "łańcuchowo":
koda[? "key"][| 5][# 10, 12][$ "prop"][? "level"]
---
Jak łatwo zapamiętać akcesory?
Jest na to prosty sposób - należy wykorzystać wyobraźnię.
Listy powinny się kojarzyć z czymś wypisanym z góry na dół, z numeracją w jednej linii, stąd znak pionowej lini - |
Mapy powinny się skojarzyć z mapą skarbu, gdzie znakiem zapytania oznaczono poszukiwaną skrzynię - ?
Gridy powinny się skojarzyć z tablicą w której szukamy konkretnej komórki - stąd krzyżyk - #
Structy powinny się kojarzyć z pierwszą literą - "s", którą jednak zapisujemy jako podobny znak specjalny - $
Tablice tak samo jak structy, skojarzmy z pierwszą literą słowa "array" i też zapiszmy jako znak specjalny podobny do "a" - @
[ALIGN=center][/ALIGN]
Wskazówka:
Przed wydaniem 2.3 GameMaker Studio, wiele funkcji ds_ powodowało błąd krytyczny, jeśli dany wpis nie istniał w strukturze. Obecnie jednak zwracają one typ
undefined
gdy wartości brak, co mocno ułatwia pracęMapy - [# key]ds_map to nic innego jak tablica haszy, gdzie kluczami mogą być nie tylko liczby, ale też tekst.
Odpowiedniki składni za pomocą akcesorów to:
ds_map_set(map, key, value)
zapisujemy jako map[? key] = value
ds_map_find_value(map, key)
zapisujemy jako map[? key]
key
może być "tekstem" lub liczbą całkowitą.Listy - [| index]Listy są bardzo podobne do tablic, ale posiadają opcję znajdywania pozycji na której jest dana wartość, czy pomieszania elementów.
Odpowiedniki składni za pomocą akcesorów to:
ds_map_set(map, key, value)
zapisujemy jako map[? key] = value
ds_map_find_value(map, key)
zapisujemy jako map[? key]
index
jest zawsze liczbą całkowitą.Wskazówka:
Od wersji 2022.11 GameMakera, tablice posiadają nowe funkcje (znajdywanie elementu, sortowanie) które pozwalają zbliżyć je do list, jeśli nie potrzebujemy losowania warto korzystać z tablic, ponieważ są zbierane przez garbage collector
Gridy - [# x, y]Gridy są bardzo podobne do tablic 2D, ale posiadają opcję ustawiania/zbierania danych z obszarów (prostokąt, koło).
Odpowiedniki składni za pomocą akcesorów to:
ds_grid_add(index, x, y, val)
zapisujemy jako grid[# x,y] = value
ds_grid_get(index, x, y)
zapisujemy jako grid[# x,y]
x, y
są zawsze liczbami całkowitymi.Wskazówka:
Jeśli wyjdziemy poza rozmiar grida, w konsoli "Ouput" GMa zobaczymy komunikat
Grid 0, index out of bounds writing [1,1] - size is [1,1]
Struct - [$ property]Struktury są "lekkimi obiektami", konterem pozwalającym przetrzymywać dane. Poza notacją struct.property, możemy też odczytywać dane za pomocą akcesorów:
struct.property = value
oraz variable_struct_set(struct, "property", value)
zapisujemy jako struct[$ "property"] = value
Pobieranie
struct.property
oraz variable_struct_get(struct, "property")
zapisujemy jako struct[$ property]
Jak już wspomniałem, struktury są lekkimi obiektami - dlatego też, powyższa składnia działa także dla instancji obiektów:
instance.property = value
oraz variable_instance_set(instance, property, value)
zapisujemy jako instance[$ property] = value
Pobieranie
instance.property
oraz variable_instance_get(instance, property)
zapisujemy jako instance[$ property]
property
powinno być albo "tekstem", albo zmienną która przetrzymuje tekst.Wskazówka:
Dzięki temu, że [$ ] pozwala na ustawienie dowolnego tekstu, możliwe jest tworzenie zmiennych ze spacjami możliwych do odczytania tylko przez akcesory i funkcje "variable_".
Tablice - [@ index]Wskazówka:
Dotyczy wszystkich wersji GameMakera przed 2022.1, a nowszych jedynie, jeśli w opcjach projektu zaznaczymy checkbox "Copy on write"
W przypadku mechanizmu "copy on write" GameMaker nie modyfikuje tablic przekazanych do funkcji, a tworzy ich kopie i zmienia dane w nich, np.
kodfunction change_array(array) {
array[0] = 1; // tworzy kopię tablicy array jako ukrytą "tymczasową" zmienną i to jej ustawia wartość 1
return array;
}
var b = change_array([0]);
show_debug_message(a); // zwraca [0]
show_debug_message(b); // zwraca [1]
Aby w tym przypadku zmodyfikować oryginalną tabloicę, należałoby napisać:
kodarray[@ 0] = 1;
Warto zaznaczyć, że jeśli nie zmieniamy tablicy w funkcji, to return zwróci nam oryginalną tablicę. Trzeba więc uważać, bo kod taki jak:
kodfunction change_array(array) {
if (irandom(1) == 0) {
array[0] = array[0];
}
return array;
}Losowo zwróci nam raz referencję do tej samej tablicy, a raz jej kopię. Stąd też w nowszych wersjach zrezygnowano z tego mechanizmu, gdyż stawia on pułapki dla nieświadomych początkujących programistów, a wprowadzono funkcję array_copy().
Łańcuchowe kojarzenie akcesorów (GM 2.3+)Nic nie stoi na przeszkodzie, aby jeden typ danych wstawiać w inny, a potem odczytywać go "łańcuchowo":
koda[? "key"][| 5][# 10, 12][$ "prop"][? "level"]
---
Jak łatwo zapamiętać akcesory?
Jest na to prosty sposób - należy wykorzystać wyobraźnię.
Listy powinny się kojarzyć z czymś wypisanym z góry na dół, z numeracją w jednej linii, stąd znak pionowej lini - |
Mapy powinny się skojarzyć z mapą skarbu, gdzie znakiem zapytania oznaczono poszukiwaną skrzynię - ?
Gridy powinny się skojarzyć z tablicą w której szukamy konkretnej komórki - stąd krzyżyk - #
Structy powinny się kojarzyć z pierwszą literą - "s", którą jednak zapisujemy jako podobny znak specjalny - $
Tablice tak samo jak structy, skojarzmy z pierwszą literą słowa "array" i też zapiszmy jako znak specjalny podobny do "a" - @
[ALIGN=center][/ALIGN]