Podstawy GDScript – część 6 – pętle for i while (Godot tutorial po polsku)
Chwilę mnie nie było, bo byłem zajęty innymi ważnymi sprawami, ale już wracam z kolejną częścią programowania w GDScript:) Dzisiaj będzie jak coś zrobić, żeby się nie narobić – czyli o wykonywaniu operacji w pętlach.
Czym są pętle?
Pętla to taka konstrukcja w programowaniu, która (cytując Wikipedię) „umożliwia cykliczne wykonywanie ciągu instrukcji określoną liczbę razy, do momentu zajścia pewnych warunków, dla każdego elementu kolekcji lub w nieskończoność.”
Czyli gdybym na przykład chciał wyświetlić wiersz po wierszu rzeczy wiszące na wieszaku w poprzedniej części, musiałbym wiersz po wierszu użyć instrukcji print i ręcznie podawać numer w tablicy:
extends Node
var szafa: Array[String] = ["spodnie dlugie", "koszulka", "spodnie krotkie", "spodnica dluga", "spodnica krotka"]
func _ready() -> void:
print(szafa[0])
print(szafa[1])
print(szafa[2])
print(szafa[3])
print(szafa[4])Dzięki pętlom można zrobić to dużo łatwiej – konstrukcja pętli jest taka:
for aktualnie_przetwarzany_element in tablica_lub_zakres_do_przetworzenia:
instrukcjeGdzie:
- aktualnie_przetwarzany_element – nowa tymczasowa zmienna, która będzie działać tylko w obrębie tej pętli, a do której będzie wpisany aktualnie „obrabiany” element z tablicy/zakresu.
- tablica_lub_zakres_do_przetworzenia – nasze „od – do” dla pętli. Jeżeli będzie to tablica, to lista od pierwszego do ostatniego elementu, a jeżeli zakres liczb, to po prostu liczby „od – do”. Pętla zostanie uruchomiona tyle razy, ile jest elementów.
- instrukcje – instrukcję które będą wykonywane w każdym przebiegu pętli.
Ok, przetestujmy najpierw z zakresem – przy okazji poznajcie funkcję range, która zwraca konfigurowalny zakres liczb. Bardzo przydatne narzędzie. Podam przykłady użycia w kodzie poniżej:
extends Node
func _ready() -> void:
# zmienna ktorej uzyjemy przy testowaniu zakresu w funkcji range
var n = 10
print("Najprostszy przykład, gdzie po prostu podajemy liczbę do której komputer ma liczyć od zera:")
for aktualnie_przetwarzany_element in n:
print(aktualnie_przetwarzany_element)
print("---")
print("Przykłady użycia range z jednym parametrem - odlicza od 0 do n - zwiększając numer o jeden:")
print("---")
for aktualnie_przetwarzany_element in range(n):
print(aktualnie_przetwarzany_element)
print("---")
print("Z dwoma parametrami odlicza od pierwszego parametru do drugiego - zwiększając numer o jeden:")
print("---")
for aktualnie_przetwarzany_element in range(3, n):
print(aktualnie_przetwarzany_element)
print("---")
print("Z trzema parametrami odlicza od pierwszego do drugiego ze skokiem określonym przez trzeci parametr:")
print("---")
for aktualnie_przetwarzany_element in range(0, n, 2):
print(aktualnie_przetwarzany_element)
print("---")
print("Podobnie można też odliczać do tyłu, jeżeli parametr pierwszy jest większy od drugiego, tutaj trzeba podać trzeci parametr ujemny:")
print("---")
for aktualnie_przetwarzany_element in range(n, 3, -2):
print(aktualnie_przetwarzany_element)
Co ważne – jeżeli przeskakujemy co kilka numerów – pętla skończy się jeżeli przeskoczyliśmy ostatni element (np. przy odliczaniu od 0 do 10 z krokiem co 2, to obliczy nam 0, 2, 4, 6, 8. Zaczynając od zera dziesiątą liczbą jest 9, a 10 będzie już poza zakresem).
Dla naszego przykładu z szafą – jeżeli użyjemy zakresu – będzie to wyglądało tak, że wieszak będzie numerem, którego użyjemy do wskazania elementu w tablic szafa:
extends Node
var szafa: Array[String] = ["spodnie dlugie", "koszulka", "spodnie krotkie", "spodnica dluga", "spodnica krotka"]
func _ready() -> void:
for wieszak in szafa.size():
print(szafa[wieszak])Jest to zastosowanie pierwszego przykładu z poprzedniego skryptu. Za n robi nam rozmiar tablicy. Zauważ od razu jaka oszczędność czasu – 2 wiersze kodu zamiast 5 (a co by było jakby trzeba było wyświetlić 100 pozycji?:)
Możemy też wyświetlić co drugie ubranie z szafy:
extends Node
var szafa: Array[String] = ["spodnie dlugie", "koszulka", "spodnie krotkie", "spodnica dluga", "spodnica krotka"]
func _ready() -> void:
for wieszak in range(0, szafa.size(), 2):
print(szafa[wieszak])ALE dla tablic jest też osobna konstrukcja, która pozwala po prostu wyświetlić kolejne elementy bez żadnych kombinacji, a wieszak będzie od razu aktualnym elementem:
extends Node
var szafa: Array[String] = ["spodnie dlugie", "koszulka", "spodnie krotkie", "spodnica dluga", "spodnica krotka"]
func _ready() -> void:
for wieszak in szafa:
print(wieszak)Dla każdego wieszaka w szafie wyświetl zawartość wieszaka – to jest po prostu mistrzostwo:)
Tak samo możemy operować na tablicy elementów sceny Godota, np. na Sprite2D, co pokazuję na końcu filmu towarzyszącemu tej części kursu.
Pętla while
Jest jeszcze drugi sposób na uruchamianie kodu w pętli – przydaje się gdy zakres nie jest nam znany – pętla będzie wykonywana dopóki nie zostanie spełniony dany warunek. Konstrukcja jest mega prosta:
while warunek:
kod_ktory_bedzie_wykonywany_dopoki_warunek_nie_zostanie_spelnionyO warunkach pisałem więcej tutaj.
Kolejny przykład z szafą – szukamy kombinezonu, ale nie wiemy w którym miejscu on jest. Wyciągamy więc ubrania z szafy dopóki na niego nie trafimy:
extends Node
var szafa: Array[String] = ["spodnie dlugie", "koszulka", "spodnie krotkie", "spodnica dluga", "kombinezon", "spodnica krotka"]
func _ready() -> void:
var x = 0
var wieszak: String = ""
while wieszak != "kombinezon":
wieszak = szafa[x]
print("Wyciągam z szafy: " + wieszak)
x += 1
print("Jest ", wieszak)Przydatne, prawda?:)
Tradycyjnie wideo towarzyszące:
Przykładowy projekt do pobrania możesz ściągnąć tutaj Godot – pętle for i while w GDScript.
A następnym odcinku pokażę jak poruszać sprajtem za pomocą klawiatury i pada!



Opublikuj komentarz