×

Podstawy GDScript – część 6 – pętle for i while (Godot tutorial po polsku)

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:
    instrukcje

Gdzie:

  • 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_spelniony

O 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