×

Godot po polsku – podstawy GDScript – część 1 – pierwszy skrypt i kolejność uruchomienia

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:

  1. Pobierz Godot ze strony godotengine.org.
  2. Utwórz nowy projekt i nazwij go np. „MojaPierwszaGra”.
  3. 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