Godot po polsku – podstawy GDScript – część 1 – pierwszy skrypt i kolejność uruchomienia
Jeśli marzysz o tworzeniu gier, ale nie wiesz od czego zacząć — jesteś w dobrym miejscu. W tym wpisie pokażę Ci, jak zrobić kolejny krok korzystając z silnika Godot i jego języka skryptowego GDScript. Nie musisz mieć doświadczenia — wystarczy ciekawość i chęć do nauki. Aczkolwiek wcześniejsza znajomość innych języków programowania nie zaszkodzi. Zwłaszcza Pythona, do którego napisałem mini-kurs, a do którego GDScript jest bardzo podobny.
Czym jest GDScript?
GDScript to język skryptowy stworzony specjalnie dla Godot Engine. Nie wymaga skomplikowanych narzędzie, jest prosty i łatwy do nauki — co czyni go idealnym dla początkujących. Dzięki niemu możesz sterować obiektami w grze, reagować na zdarzenia i tworzyć interaktywne światy.
Przygotowanie środowiska
Zanim napiszemy pierwszy skrypt, musimy przygotować środowisko:
- Pobierz Godot ze strony godotengine.org.
- Utwórz nowy projekt i nazwij go np. „MojaPierwszaGra”.
- Dodaj scenę typu Node2D — to będzie nasz punkt startowy.
Kroki te pokazywałem przy okazji wprowadzenia do Godota:
Pierwszy skrypt w GDScript
Dodajmy skrypt do naszego Node2D. Kliknij na niego pawym przyciskiem myszy w Inspektorze, wybierz Attach Script. Pojawi się okienko tworzenia skryptu:

- Language – język skryptu – domyślnie GDScript (w wersji z .NET można również wybrać C#)
- Inherits – z jakiego typu noda skrypt dotyczy. Najczęściej jest to taki typ, do jakiego skrypt jest przypisany. W naszym przypadku Node2D. Opowiadałem o tym w tym filmie.
- Template – szablon skryptu – zostawiamy domyślny.
- Built-in script – czy skrypt ma być osadzony w scenie, zostawiamy odznaczone jak domyślnie.
- Path – ścieżka gdzie plik zostanie zapisany oraz jego nazwa – res:// na początku oznacza, że będzie to w folderze projektu. Przy większej ilości plików warto tworzyć podfoldery, ale na tym etapie zostawiamy domyślną nazwę i ścieżkę.
- Pod spodem okienko z podsumowaniem – jak nic nie jest na czerwono, to jest OK. Klikamy Create.
Domyślny kod pojawi się w edytorze (zakładka Script na górnym pasku, nie przejmuj się jeżeli masz inne kolory, nie mają wpływu na działanie kodu):
extends Node2D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
Zanim pójdziemy dalej – wszystkie linie zaczynające się znakiem # są komentarzami – czyli informacjami przydatnymi dla osoby czytającej kod, ale nie mające wpływu na jego wykonanie.
Możemy wyróżnić w powyższym kodzie 3 bloki:
extends Node2D
Słowo kluczowe extends mówi z jakiej klasy (w uproszczeniu typu noda w tym przypadku) dziedziczy obiekt, do którego przypinamy skrypt. Będzie to tutaj Node2D. To znaczy, że będziemy w skrypcie mogli używać właściwości i funkcji Node2D.
Dalej mamy dwie funkcje – zaczynające się od słowa func oraz nazwy funkcji rozpoczynającej się _ (podkreślnikiem). Następnie mamy nawiasy – jeżeli coś tam jest, to znaczy, że funkcja może przyjąć przy wywołaniu jakiś parametr. W przypadku _process przekazaną wartość będziemy mogli odczytać ze zmiennej o nazwie delta (w następnym wpisie na blogu wyjaśnię zmienne). Na końcu po znakach -> możemy określić czy – i jakiego typu – wartość funkcja będzie zwracała po uruchomieniu (np. jeżeli tworzymy funkcję pomniejszającą ilość żyć gracza – możemy sprawić, że funkcja nam „odpowie” informacją ile żyć jeszcze zostało).
Po dwukropku zaczynamy nową linią i wcięciem (tab) tzw. ciało funkcji – czyli instrukcje, które po jej wywołaniu zostaną wykonane.
Funkcja kończy się w momencie, kiedy następna linia zaczyna się od początku następnego wiersza, bez wcięcia. Musi również mieć przynajmniej jedną instrukcję – jeżeli jest pusta i tworzymy tylko taki wypełniacz – wstawiamy instrukcję pass. Powoduje ona po prostu zakończenie funkcji.
_ready oraz _process to wbudowane funkcje, których możemy, ale nie musimy używać – w zależności od potrzeb. W naszym przypadku użyjemy obu, żeby przetestować ich działanie.
func _ready() -> void:
pass
Jest uruchamiana kiedy węzeł, do którego skrypt jest przypisany został załadowany i jest gotowy do użycia
func _process(delta: float) -> void:
pass
Jest uruchamiana przed wyświetleniem każdej klatki obrazu. Jest to miejsce na wszelkie obliczenia i zmianę parametrów wyświetlanych obiektów jak położenie, obrót czy kolor. Delta w tym przypadku będzie zawierała czas jaki minął od ostatnio narysowanej klatki w sekundach (a dokładnie w ułamkach sekund, bo w ciągu sekundy może być ich narysowanych nawet kilkaset – w zależności od szybkości komputera).
Uruchomienie skryptu i kolejność ładowania nodów
Skrypt jest uruchamiany w momencie załadowania nodów do sceny. Węzły (nody) w scenie są ułożone jak gałęzie drzewa – przy czym główny węzeł jest jak korzeń i od niego podrzędne sceny rozgałęziają dalej. Gdy mamy w scenie więcej nodów – najpierw zostaną uruchomione ten najdalej od korzenia (najbardziej zagnieżdżone), a później będą uruchamiane te wyżej. Od góry do dołu, przy czym węzeł główny sceny zostanie załadowany na samym końcu. Warto pamiętać o tej kolejności jeżeli są zależności między poszczególnymi elementami sceny.

Na potrzeby tej sekcji tworze nowy projekt i buduję scenę z węzłów typu Node. Do każdego węzła jest dodany ten sam skrypt – jak i dlaczego – pokazuję w filmie poniżej.

Dokładniej i krok po kroku pokazuję to w filmie poniżej:
A tutaj gotowy projekt do pobrania i przetestowania dla leniwych;)
Ok, teraz to już na prawdę mamy bazę, żeby pójść w konkrety – w następnym wpisie będzie o zmiennych. Pokaże także więcej operacji na nodach. Do zobaczenia!
Opublikuj komentarz