×

Podstawy GDScript – część 5 – tablice (arrays) (Godot tutorial po polsku)

Podstawy GDScript – część 5 – tablice (arrays) (Godot tutorial po polsku)

Witaj w kolejnej części tutoriala GSDscript po polsku. W drugiej części wyjaśniałem czym są i jak działają zmienne – dzisiaj opowiem kolejnych typach pozwalających przechowywać całe zbiory innych typów. Są to tablice oraz słowniki.

Czym jest tablica danych (ang. array)?

Najprościej mówiąc tablice danych służą do przechowywania większych ilości innych danych w uporządkowanej kolejności. Można je porównać do szafy na ubrania. Tak, przykład ubraniami będzie dobry:) Taka szafa z rurą na wieszaki, które będziemy zawsze wieszać od lewej strony, bo przecież jakiś porządek musi być. Pierwszy wieszak zawsze będzie miał numer 0. A ostatni to ilość wieszaków -1 (mamy 5 wieszaków, czyli licząc od zera ostatni będzie miał numer 4). Numer w tablicy nazywamy indeksem.

Tak to już jest w większości języków programowania i trzeba się z tym pogodzić. Dla zobrazowania rysunek:

Tablice – podobnie jak zmiennie możemy zadeklarować i używać ich bez typu – lub z konkretnym typem.

# szafa bez podanego typu - możemy mieszać i dodawać różne wartości
var szafa1 = []
# szafa o określonym typie - możemy w niej przechowywać tylko obiekty typu String
var szafa2: Array[String]

Dodawanie elementów tablicy

Elementy do tablicy możemy dodawać na kilka sposobów:

  • przy inicjalizacji tablicy w kwadratowych nawiasach, oddzielone przecinkami
  • dodać nową zawartość tak samo jak przy inicjalizacji, ale gdy program jest już uruchomiony – zawartość zostanie całkowicie zmieniona
  • konkretny element wskazując miejsce w tablicy (indeks), np. szafa[0] = „koszula” – koszula pojawi się na pierwszym wieszaku w naszym przykładzie, jeżeli coś tam już było, zostanie usunięte i zapomniane
  • dodać na koniec tablicy (powiększając jej rozmiar o kolejny element) – szafa.append(„krawat”)
  • dodać element lub listę elementów operatorem +=

W przykładach będę pracował na typie String ale jak wyżej wspomniałem typy mogą być mieszane, może być typu int czy float, a nawet mogą być tablicą Node czy Sprite2D.

Odczytywanie elementów z tablicy

Elementy można odczytywać z tablic na kilka sposobów. Podstawowym jest po prostu podanie indeksu w nawiasach kwadratowych po nazwie tablicy. Działają też tutaj liczby ujemne – jeżeli pierwszy element tablicy ma index 0, to -1 będzie wskazywać na ostatni element. Np. szafa[3] lub szafa[-1].

Odczytywanie wycinka tablicy

Do pobrania wycinka tablicy możemy użyć metody slice, w której parametrach podajemy indeksy od i do którego momentu chcemy pobrać dane. Np. szafa.slice(1,3) (tutaj już normalne nawiasy, bo przekazujemy metodzie parametry).

Odczytywanie losowego elementu tablicy

Element losowy odczytujemy metodą pick_random – np. szafa.pick_random().

Odczytywanie pierwszego i ostatniego elementu tablicy

Pierwszy i ostatni element odczytujemy odpowiednio metodami front i back – jeżeli tablica jest pusta, zwrócą wartość null.

Wyjmowanie pierwszego i ostatniego elementu z tablicy

Pierwszy i ostatni element możemy też odczytać i wyjąć z tablicy. Po odczytaniu zostanie on usunięty. Np. szafa.pop_front(), szafa_pop_back().

W przypadku wyjęcia pierwszego elementu zmienią się pozycje pozostałych!

Liczenie ile jest elementów w tablicy

Do liczenia elementów w tablicy służy metoda count. Np. szafa.count()

Sprawdzanie czy dana wartość występuje w tablicy

Metodą has można sprawdzic czy interesująca nas wartość występuje w tablicy. Jeżeli tak, metoda zwróci true, w innym przypadku false. Typ ma tutaj znaczenie – 7, 7.0 i „7” to trzy różne rzeczy – w zależności czy szukamy w tablicy liczby całkowitej, zmiennoprzecinkowej czy tekstu. Np. szafa.has(7).

Sprawdzanie rozmiaru tablicy

Rozmiar tablicy podaje metoda size. Wynikiem będzie 0 jeżeli tablica jest pusta.

Usuwanie pojedynczego elementu na wskazanej pozycji

Możemy też usunąć pojedynczy elementu na wskazanej pozycji podając indeks – na przykład chcemy usunąć ubranie z 3 wieszaka: szafa.remove_at(2) (jeszcze raz przypominam – numeracja elementów w tablicy zaczyna się od 0. Czyli jak normalnie ubrania w szafie odliczasz 1, 2, 3 – to działając na tablicach będzie 0, 1, 2. Stąd 3 wieszak ma numer 2).

Losowanie i sortowanie elementów w tablicy

Losowanie i sortowanie elementów w tablicy możemy zrobić za pomocą metod szuffle() oraz sort().

Elementy są sortowane w kolejności rosnącej. Żeby posortować malejąco – trzeba po sort() odwrócić tablicę jak poniżej.

Odwracanie kolejności elementów w tablicy

Kolejność elementów w tablicy możemy odwrócić metodą reverse(). Warto zapamiętać, że domyśl

Przykłady w kodzie

Nie chciałem się wyżej rozdrabniać, sprawdzimy przykłady za jednym razem w kodzie poniżej. Po kilku poprzednich lekcjach nie powinno być problemu ze skopiowaniem skryptu do nowego projektu i uruchomieniu go, prawda?

extends Node

@export var szafa: Array[String] = ["spodnie dlugie", "koszulka", "spodnie krotkie", "spodnica dluga", "spodnica krotka"]


func _ready() -> void:
	print("Odczytywanie pojedynczych elementow: szafa[2]")
	print(szafa[2])
	print("Odczytywanie pojedynczych elementow: szafa[-1]")
	print(szafa[-1])
	print("---")
	print("Odczytywanie wycinka tablicy: szafa.slice(1,3)")
	print(szafa.slice(1,3))
	print("---")
	print("Odczytywanie losowego elementu: szafa.pick_random()")
	print(szafa.pick_random())
	print("Odczytywanie losowego elementu raz jeszcze:")
	print(szafa.pick_random())
	print("---")
	print("Odczytywanie pierwszego i ostatniego elementu: szafa.front() oraz szafa.back()")
	print(szafa.front())
	print(szafa.back())
	print("---")
	print("Wyjmowanie pierwszego elementu z tablicy: szafa.pop_front()")
	print("Tablica przed: ", szafa)
	print(szafa.pop_front())
	print("Tablica po - zwroc uwage, ze indeksy wszystkich elementow zmniejszyly sie o 1: ", szafa)
	print("---")
	print("Wyjmowanie pierwszego elementu z tablicy: szafa.pop_back()")
	print("Tablica przed: ", szafa)
	print(szafa.pop_back())
	print("Tablica po: ", szafa)
	print("---")
	print("Liczymy ile jest elementów w tablicy (rozmiar): szafa.size()")
	print(szafa.size())
	print("Dodajemy do pozostalych ubran kilka kolejnych operatorem +=: ")
	szafa += ["spodnie dlugie", "koszulka", "spodnie krotkie", "spodnica dluga", "spodnica krotka"]
	print("Szafa: ", szafa)
	print("---")
	print("Liczymy ile jest teraz elementów w tablicy: ")
	print(szafa.size())
	print("---")
	print('Sprawdzamy czy jest koszulka w tablicy: szafa.has(\"koszulka\")')
	print(szafa.has("koszulka"))
	print("A teraz sprawdzamy czy sa w szafie buty:")
	print(szafa.has("buty"))
	print("---")
	print("Szukamy koszulki - a jezeli jest, to na ktorej pozycji (-1 jezeli nie ma w ogole): szafa.find(\"spodnie krotkie\")")
	print(szafa.find("spodnie krotkie"))
	print("---")
	print("Ile mamy koszulek w szafie: szafa.count(\"koszulka\")")
	print(szafa.count("koszulka"))
	print("---")
	print("Usuwamy element na konkretnej pozycji: szafa.remove_at(2)")
	print("Tablica przed: ", szafa)
	# uwaga - remove_at nie zwraca zadnej wartosci, wiec najpierw musmy 
	# te instrukcje wykonac, a pozniej mozemy wyswietlic szafe
	# poprzednich moglismy w print uzyc, bo zwracaly wartosci
	szafa.remove_at(2)
	print(szafa)
	print("Tablica po: ", szafa)
	print("---")
	print("Sortujemy elementy tablicy rosnaco: szafa.sort()")
	szafa.sort()
	print(szafa)
	print("A teraz odwracamy tablice i mamy posortowane malejaco: szafa.reverse()")
	szafa.reverse()
	print(szafa)
	print("---")
	print("I robimy z powrotem balagan losujac elementy: szafa.shuffle()")
	szafa.shuffle()
	print(szafa)

Po uruchomieniu kodu zobaczysz linia po linii jakie komendy były uruchomione i jakie były wyniki ich działania. Oczywiście zachęcam do eksperymentowania:)

Uwaga! Nie było okazji wcześniej, żeby to pokazać – jeżeli String jest elementem dłuższej instrukcji, a zawiera znaki, które mogą być elementem składni, to może wyskoczyć nam błąd. Łatwo tego uniknąć dając odwróconą kreskę ułamkową zwaną backslashem przed takim znakiem. Przykład:

Taka instrukcja nie zadziała, bo komputer spodziewa się ” na początku i końcu parametru:

print(„Element tablicy[0] to „koszulka””)

Żeby to obejść mamy dwa sposoby:

  • dodać / przed wewnętrznymi cudzysłowami: print(„Element tablicy[0] to \”koszulka\””)
  • zamienić wewnętrzne cudzysłowy na pojedyncze: print(’Element tablicy[0] to \”koszulka\”’)

Oba przykłady zastosowałem w powyższym kodzie;)

Edycja tablicy w inspektorze

Tablice można też wypełniać i edytować w Inspektorze – podobnie jak pokazywałem przy okazji adnotacji w części 3 – zwróć uwagę, że dodałem @export przed deklaracją tablicy w kodzie. Po skopiowaniu tego kodu sprawdź okno Inspektora:

Jak widzisz można też „wyklikać” sobie tablicę na start – można elementy dodawać, usuwać i zamieniać miejscami (przeciągając te kwadratowe ikonki z trzema kreskami przy numerze po lewej). W prawej kolumnie możemy umieszczać z kolei obiekty z okna Scene – np. Sprite2D lub inne Node – tak długo jak typ tablicy na to pozwala.

Zakończenie

Tablice to całkiem szeroki temat – wybrałem co moim zdaniem najważniejsze na początek. W następnym odcinku pokażę jeszcze ciekawsze zastosowanie – będę operował na tablicy sprajtów:)

Do następnego razu!

Dodatkowe materiały

Dla ciekawskich – więcej informacji i spis metod tablice w GDScript w oficjalnej dokumentacji.

Projekt do pobrania znajdziesz tutaj (Godot 4.5).

Oraz tradycyjnie nagranie uzupełniające;)

Opublikuj komentarz