Skocz do zawartości

Grids - Siatki


Rekomendowane odpowiedzi

GRIDS

Siatki to jeden z 6 typów struktur danych występujących w Game Makerze. Siatki to tak naprawdę super elastyczne tablice dwu-wymiarowe, na których o wiele łatwiej wykonywać obliczenia niż na zwyczajnych tablicach. Napisałem ten artykuł, aby opisać wam poszczególne funkcje, które pozwalają nam korzystać z siatek. Wiem że brakuje tu jakiegoś przykładu zastosowania siatek. Jak ktoś takowy zrobi to będę wdzięczny ;p

Jeśli dopatrzysz się w nim jakiś błędów to napisz :D pozdrawiam, Misiek ;p

 

OPIS FUNKCJI

 

 

Tworzenie siatki

Aby stworzyć siatkę, wykorzystujemy funkcję ds_grid_create(w,h). W miejsce „w” wpisujemy długość siatki, natomiast w „h” wysokość naszej siatki. Napiszmy następujący kod :

grid1 = ds_grid_create(5,5);

wtedy stworzy nam się siatka o długości 5 i wysokości 5. Graficznie możemy przedstawić ją w taki sposób :

1.png

Aby usunąć siatkę używamy funkcji ds_grid_destroy(id) . w miejsce id wpisujemy indeks naszej siatki (np. w naszym wypadku było by to grid1). Aby wyczyścić siatkę (wypełnić ją jakąś jedną liczbą )używamy ds_grid_clear(id,val). W pole „val” wpisujemy jaka ma to być liczba.

 

Dodawanie wartości do siatki

Do każdej z komórek możemy przypisywać dowolną wartość. Użyjemy do tego funkcji ds_grid_set(id,x,y,val). W miejsce x i y wpisujemy współrzędne naszej komórki, natomiast w „val” wartość jaką chcemy przypisać tej komórce. Dla przykładu, jak napiszemy :

ds_grid_set(grid1,0,0,5);
ds_grid_set(grid1,3,2,3);
ds_grid_set(grid1,2,4,2);

Nasza siatka będzie wyglądać w taki sposób :

2.png

 

Wartość znajdującą się w komórce możemy również pomnożyć przez dowolną liczbę. Przeznaczona jest do tego funkcja ds_grid_multiply(id,x,y,val). Jeśli napiszemy na przykład :

ds_grid_multiply(grid1,0,0,2);

Wartość znajdująca się w siatce grid1 o współrzędnych 0 i 0 zostanie pomnożona przez 2.

 

Jeśli natomiast chcemy aby do wartości w komórce została dodana jakaś wartość posługujemy się funkcją ds_grid_add(id,x,y,val) na przykład :

ds_grid_add(grid1,0,0,2);

do Wartości znajdującej się w siatce grid1 o współrzędnych 0 i 0 zostanie dodana liczba 2.

 

Naszą siatkę możemy również bez problemu pomniejszyć lub powiększyć. Posłużymy się wtedy funkcją ds_grid_resize(id,w,h). W miejsce „w” wpisujemy nową długość a w „h” wysokość. Po wpisaniu :

ds_grid_resize(grid1,8,5);

Nasza siatka ( z tego artykułu ) będzie wyglądać tak :

3.png

Jak widać wszystkie dotychczasowe wartości zostały zachowane

 

Kolejną funkcją wartą uwagi jest ds_grid_set_region(id,x1,y1,x2,y2,val)

Dzięki niej wypełnimy pewien region ( prostokąt ) naszej siatki jakąś wartością. W id wpisujemy indeks naszej siatki (np.grid1) w x1 oraz y1 jeden a w x2 oraz y2 drugi przeciwległy kąt naszego regionu a w val wartość. Po wpisaniu kodu :

ds_grid_set_region(grid1,1,1,4,3,12);

nasza siatka będzie wyglądać tak :

4.png

 

Aby pewien region pomnożyć przez pewną wartość użyjemy funkcji ds_grid_multiply_region(id,x1,y1,x2,y2,val)

Pamiętacie ? tak samo było z funkcją ds_grid_multiply(id,x,y,val), którą opisałem wcześniej, tylko że teraz nie mnożymy jednej komórki ale jakiś większy region przez jedną liczbę.

Z dodawaniem jest tak samo. Aby wszystkie wartości znajdujące się w określonym regionie powiększyć o jakąś liczbę używamy funkcji. ds_grid_add_region(id,x1,y1,x2,y2,val)

Oprócz powyższych funkcji istnieją jeszcze 3 podobne : ds_grid_set_disk(id,xm,ym,r,val)

, ds_grid_add_disk(id,xm,ym,r,val), ds_grid_multiply_disk(id,xm,ym,r,val)

służą one do tego samego tylko że region nie jest w kształcie prostokąta, lecz jest kołem.

 

Odczytywanie wartości z siatki

Aby odczytać wartość z jakiejś komórki w naszej siatce użyjemy funkcji ds_grid_get(id,x,y)

Przykładowo, jeśli chcesz aby zmienna speed miała wartość komórki o współrzędnych 2,4 to piszesz :

speed = ds_grid_get(grid1,2,4)

 

Przyjrzyjmy się temu obrazkowi :

5.png

W jaki sposób dodać do siebie te wszystkie wartości w niebieskiej obwódce ? do tego przeznaczona jest funkcja ds_grid_get_sum(id,x1,y1,x2,y2). Id to indeks naszej siatki, x1, y1, x2, y2 to współrzędne regionu w którym ma być wykonane sumowanie. Wystarczy więc napisać :

Zmienna0 = ds_grid_get_sum(grid1,0,0,3,4)

Aby zmienna Zmienna0, przyjęła wartość sumy liczb 5, 3 oraz 2. Jak łatwo się domyśleć jest to 10 :D

 

A jak dodać sumy tych dwóch regionów ?

6.png

Wystarczy napisać :

Zmienna0 = ds_grid_get_sum(grid1,0,0,3,4) + ds_grid_get_sum(grid1,4,0,4,4)

Proste, nieprawdaż ? ;p

 

Nikt nie powiedział, że możemy sumować regiony tylko na jednej siatce. Spójrz na ten rysunek :

7.png

Jak widzisz jeden region jest w grid1 ( pierwsza siatka ) a drugi w grid2 ( druga siatka ). Bez problemu możemy odjąć wyniki sumowania tych dwóch regionów, wystarczy napisać :

Zmienna0 = ds_grid_get_sum(grid1,1,0,2,3) - ds_grid_get_sum(grid2,1,0,4,3);

 

Funkcja, która zwróci nam największą liczbę z regionu to ds_grid_get_max(id,x1,y1,x2,y2)

, natomiast funkcja ds_grid_get_min(id,x1,y1,x2,y2)zwróci nam najmniejszą liczbę z określonego przez nas regionu. Jak zażyczymy sobie średnią z regionu – nie ma problemu – użyjemy funkcji ds_grid_get_mean(id,x1,y1,x2,y2).

poza tymi funkcjami są jeszcze ds_grid_get_disk_sum(id,xm,ym,r), ds_grid_get_disk_min(id,xm,ym,r), ds_grid_get_disk_max(id,xm,ym,r), ds_grid_get_disk_mean(id,xm,ym,r), które jak już się domyślacie robią to samo, co opisane prze zemnie funkcje, tylko że dotyczą regionów w kształcie koła.

 

Kopiowanie

Przyjrzyjmy się temu obrazkowi :

8.png

Co zrobić, aby wartości zaznaczone zieloną obwódką, umieścić w regionie oznaczonym fioletową obwódką ? użyjemy do tego funkcji ds_grid_set_grid_region(id,source,x1,y1,x2,y2,xpos,ypos)

W tym wypadku w miejsce id oraz source wpisujemy naszą siatkę (np. gird1). Gdyż wykonujemy tę czynność tylko na jednej siatce. W innym wypadku w miejsce source wpisujemy np. grid2. x1, y1, x2, y2 to nasz region, który chcemy skopiować. Podajemy współrzędne przeciwległych kątów. xpos oraz ypos , to miejsce w jakie chcemy coś wkleić. W tym wypadku podajemy współrzędne komórki pomalowanej na fioletowo ( jest to miejsce od którego mają się zaczynać skopiowane wartości), natomiast skopiowany region zajmie resztę miejsca, w zależności od tego jak duży skopiowaliśmy. Mam nadzieję że zrozumieliście bo trochę pomieszałem.

Podam Wam kod do lepszego zrozumienia :

ds_grid_set_grid_region(grid1,grid1,0,0,1,1,3,3);

 

skoro jesteś już w tym miejscu artykułu chyba domyślasz się do czego służą dwie pozostałe funkcje ds_grid_add_grid_region(id,source,x1,y1,x2,y2,xpos,ypos)

oraz ds_grid_multiply_grid_region(id,source,x1,y1,x2,y2,xpos,ypos)

 

Jeśli chcesz, aby jedna siatka miała takie same wartości jak druga użyj funkcji ds_grid_copy(id,source).

 

Pozostałe funkcje

Do sprawdzenia, czy jakaś wartość znajduje się w regionie użyjemy funkcji ds_grid_value_exists(id,x1,y1,x2,y2,val). Zwraca 0 lub 1. Napiszmy następujący kod :

if ds_grid_value_exists(grid1,0,0,2,4,2) then game_end()

jeśli nasza siatka będzie wyglądać tak :

2.png

gra zostanie wyłączona. Jeśli jednak nie będzie już tam tej dwójki o współrzędnych 2 i 4, nie wyłączy się.

 

Funkcja ds_grid_shuffle(id) „tasuje” wartości i ustawia je losowo w siatce.

Funkcja ds_grid_width(id)zwraca długość siatki, a ds_grid_height(id)

Wysokość.

Odnośnik do komentarza
Udostępnij na innych stronach

Pisałeś, że jesteś słaby w pisaniu artykułów, więc po co znów ten ? Takimi artykułami nie udowodnisz swoich umiejętności ;> .

 

A co do arta, to średni. Taki opis daje do zrozumienia dla początkujących tyle co help. Co to jest wysokość i szerokość siatki ? Zero praktycznych zastosowań, tak więc 3/5 .

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...