To jest tekst przetłumaczony maszynowo, który może zawierać błędy!
Skąd pochodzą te informacje?
Dużo z tego to tylko powtórzenie oficjalnej dokumentacji Godot. Poniżej znajdziecie kilka przydatnych linków do oficjalnej dokumentacji (której najchętniej polecam zamiast tej na Piggy, ale jeśli wolisz tę, to po prostu z niej korzystaj!)
Przydatne zasoby:
A co z grafiką, czy muszę ją stworzyć samemu?
Nie! Możecie znaleźć wiele darmowych zasobów tutaj:
Inne przydatne odnośniki:
Inne silnik gry innych niż Unity?
Jeśli wolisz, możesz użyć innego engine’a gier. Przykłady to:
Istnieje wiele innych; poszukaj ich, jeśli chcesz wypróbować coś innego!
Co to jest Godot?
Godot (wymawiane Guh-doh), to ‘Game Engine’ (Silnik Gry). Mówiąc prościej, jest to program, który pozwala tworzyć gry (lub zwykłe programy, jeśli chcesz). Godot może robić prawie wszystko, co potrafią inne silniki gier, zarówno 2D, jak i 3D.
Przykłady gier stworzonych w Godot: Godot Showcase
Nie tylko gry indie zostały stworzone w Godot, Sonic Colors Ultimate powstał przy użyciu Godot!
Jak zdobyć Godota?
Możesz pobrać Godota z:
- Oficjalnej strony: Oficjalna strona Godota .
- Lub na platformie Steam: Gra Godot Engine w sklepie Steama.
Po prostu pobierz, a następnie uruchom program lub go zainstaluj.
Utwórz projekt!
Po uruchomieniu Godota pojawi się to okno:
Zostaniesz poproszony o wybór języka programowania: GDScript lub C#. GDScript jest bardzo podobny do Pythona.
Różnice między GDScript a Pythonem (bez kolorów):
def hello():
tekst = "Witaj świecie!"
print(tekst)
func hello():
var tekst = "Witaj świecie!"
print(tekst)
Dla zmiennych w Pythonie wystarczy wpisać ich nazwę. W GDScript musisz najpierw napisać var, aby zadeklarować zmienną. Aby utworzyć funkcje, wpisujesz func zamiast def.
Sceny a węzły
Jednym z najważniejszych pojęć w Godocie są sceny i węzły. Zaczniemy od węzłów. Węzeł to obiekt w silniku Godot, który może reprezentować wszystko – postać gracza, przeciwnika, przycisk w menu, tekst na ekranie czy cokolwiek innego. Scena jest zbiorem węzłów.
W tym miejscu stworzymy bardzo prosty przykład.
Część 1a - Konfiguracja sceny “gracza”
Na górze okna Godot, naciśnij przycisk “2D”, aby zmienić widok na widok 2D.
Po lewej stronie okna widzicie następujący interfejs:
Naciśnij przycisk “Other Node” i wyszukaj “CharacterBody2D”, wybierz go i naciśnij “Create”. Jest to węzeł używany do gracza 2D. Możecie zauważyć, że obok węzła “CharacterBody2D” znajduje się ostrzegawczy trójkąt ⚠️. Dzieje się tak, ponieważ brakuje mu kilku rzeczy, których by chciał.
Jeśli klikniesz prawym przyciskiem myszy na węźle, zobaczysz przycisk “+ Add Child Node…”. Użyj go, aby dodać dwa węzły, Sprite2D i CollisionShape2D. Sprite2D służy do dodawania grafiki do gracza, a drugi służy do sprawdzania kolizji. Możesz również nadać im nazwy, jeśli ułatwi to śledzenie rzeczy. Nadałem swojemu CharacterBody2D nazwę “Player”. Scena powinna teraz wyglądać następująco:
Część 1b - Naprawa ⚠️ CollisionShape2D
Trójkąt ostrzegawczy w tym przypadku oznacza, że CollisionShape2D brakuje faktycznej kolizji. Możesz to naprawić, klikając na węzeł (po lewej stronie), po czym po prawej stronie pojawi się panel. Znajdziesz tam mnóstwo informacji o węźle, które możesz zmienić. Śmiało eksperymentuj z dostępnymi opcjami. Jednak skupimy się na polu „Shape” – ustaw je na przykład na RectangleShape2D. Nie jest to zbyt ważne, ponieważ nie będziemy tutaj używać kolizji.
Część 1c – Dodanie spritu (grafiki)
Jeśli klikniesz na element Sprite2D po lewej stronie, w polu po prawej pojawi się opcja „Texture” („Tekstura”). Możesz tam dodać obraz dla gracza. Wystarczy przeciągnąć plik obrazowy upuścić go w tym właśnie miejscu.
Tak będzie wyglądało dodanie sprotu.
Część 2 – Dodawanie wejścia i sprawdzanie go
Na górze okna znajduje się menu „Scena > Projekt > Debugowanie > Edytor > Pomoc”. Kliknij przycisk „Projekt”, a następnie ustawienia projektu („Ustawienia projektu”). Pojawiło się tam wiele opcji konfiguracji. Wybierz pozycję Mapa_wejściowe (ang. Input Map). Tutaj możesz przypisać klawisze na klawiaturze do konkretnych akcji w grze:
- W polu dodania nowej czynności wpisz
lewo(left) oraz kliknięcie Dodaj.
Następnie powtórz to dla prawej strony (prawo), górnej części ekranu (góra) i dolnego krańca widoku (dół):
- Te elementy nazywamy akcjami; każda z nich może zawierać kombinację znaków lub pojedynczy symbol określający daną funkcjonalność użytkownika podczas gry komputerowej! Aby dodać nowy element wybierz ‘+’ po stronie prawej od tekstu opisu działania programu komputera… :D
Rozdział 3 - Dodawanie skryptu do sterowania graczem.
Aby móc dodać logikę gry, czyli robić coś z graczem, tłem lub czymkolwiek innym w grze, potrzebujemy skryptu. Skrypty to kod i można je pisać w dwóch językach: GDScript lub C#. GDScript jest domyślny.
- Kliknij na węzeł “CharacterBody2D” (nazywam go “Player”).
- Kliknij przycisk “Attach Script” (zobacz poniżej)
- Pojawi się okno, w którym możesz wybrać język (wybierz GDScript) i ścieżkę (po prostu pozwól, aby nazywała się tak, jak jest, ale możesz jej nadać nazwę), a następnie kliknij dalej. Pojawi się okno “Script”. Na początku nie ma tu wiele.
dziedziczy po CharacterBody2D
Obecnie ten kod mówi tylko tyle, że kod ma należeć do węzła typu “CharacterBody2D”, który jest naszym graczem.
Dodamy tutaj funkcję, której będziemy używać do manipulowania graczem:
extends CharacterBody2D
func _physics_process(delta: float) -> void:
return
Physics Process?
_physics_process to funkcja, która jest aktualizowana w każdej klatce, czyli około 60 razy na sekundę (domyślnie). Istnieje inna funkcja, która nazywa się po prostu _process i jest aktualizowana w sposób ciągły. Jeśli chcesz, aby gracz poruszał się w jednostajnym tempie, użyj _physics_process.
To jest tutaj, gdzie dodamy kod, który przesuwa gracza.
Część 4 – Podstawowe dane wejściowe
W części 2 dodałeś przyciski sterujące teraz będziemy ich używać. Istnieje wbudowany obiekt o nazwie Input, którego możemy użyć aby sprawdzić czy gracz nacisnął którykolwiek z elementów ustawionych w mapie danych wejściowych (“Input Map”).
Spróbuj umieścić ten kod w funkcji _physics_process:
# Sprawdź, czy klawisz 'prawo' jest wciśnięty
if Input.is_action_pressed('right'):
# Ustaw prędkość poziomą na 100
velocity.x = 100
# Przesuń postać z uwzględnieniem kolizji
move_and_slide()
Co to jest move_and_slide()?
move_and_slide() to wbudowana funkcja w Godot, która jest używana, gdy chcemy faktycznie przesunąć to, do czego ją zastosujemy. Bez niej gracz się nie ruszy.
Warning
Odstępy między wierszami są bardzo ważne, tak jak w przypadku języka Python.
Co się dzieje po uruchomieniu programu poprzez kliknięcie przycisku odtwarzania w oknie Godota, a następnie naciśnięciu „prawego”?
Jeśli nic nie następuje:
- Czy pamiętasz o skonfigurowaniu czegoś na liście „Mapy wejść” (Input Map)?
- Czy napisałeś/aś
right, a nieRight? Innymi słowy, czy to, co wpisałeś/aś w kodzie, jest identyczne z nazwą używaną w mapie wejściowej?
Cały kod do tej pory
extends CharacterBody2D
func _physics_process(delta: float) -> void:
if Input.is_action_pressed('right'):
velocity.x = 100
move_and_slide()
Spróbuj teraz dodać kod dla 'left', 'up', 'down'.
Co musi być wartością velocity.x dla left? A co z up i down?
Cały kod teraz
extends CharacterBody2D
func _physics_process(delta: float) -> void:
if Input.is_action_pressed('right'):
velocity.x = 100
if Input.is_action_pressed('left'):
velocity.x = -100
if Input.is_action_pressed('down'):
velocity.y = 100
if Input.is_action_pressed('up'):
velocity.y = -100
move_and_slide()
Część 5 - Naprawa kodu
Możecie zauważyć, że gracz nie zatrzymuje się, gdy puszczacie kierunek. Możemy to teraz naprawić!
Przed wszystkimi if-ami, dodaj linijkę, która ustawia prędkość na 0. Można to zrobić, pisząc velocity = Vector2()
Wszystkie prędkości i kierunki w Godot są wektorami, to jest koncepcja matematyczna, na której nie będziemy się teraz skupiać, ale jeśli chcecie dowiedzieć się więcej na temat tego, co to znaczy, możecie zajrzeć tutaj: Wikipedia vectors.
Hele koden teraz
extends CharacterBody2D
func _physics_process(delta: float) -> void:
velocity = Vector2()
if Input.is_action_pressed('right'):
velocity.x = 100
if Input.is_action_pressed('left'):
velocity.x = -100
if Input.is_action_pressed('down'):
velocity.y = 100
if Input.is_action_pressed('up'):
velocity.y = -100
move_and_slide()
Kiedy rozpoczniesz grę, możesz teraz przesuwać gracza:
Dalej możesz poprawić kod, aby prędkość nie była tylko liczbą, ale mogła być przechowywana w innym miejscu.
Możesz na przykład (przed funkcją) dodać stałą, która śledzi prędkość.
Całkowy kod na końcu z użyciem const
extends CharacterBody2D
const SPEED = 100
func _physics_process(delta: float) -> void:
velovity = Vector2()
if Input.is_action_pressed('right'):
velocity.x = SPEED
if Input.is_action_pressed('left'):
velocity.x = -SPEED
if Input.is_action_pressed('down'):
velocity.y = SPEED
if Input.is_action_pressed('up'):
velocity.y = -SPEED
move_and_slide()
Część 6 – Bawcie się sami!
Jeśli wrócicie do pierwszej części, Przydatne zasoby, znajdziecie tam informacje o tym, z czym możecie nadal bawić się i eksperymentować.
Po tej sekcji spróbujcie stworzyć własną grę. Co dokładnie tworzą zależy wyłącznie od was! Jeśli chcecie coś zupełnie nowego — róbcie to! Jeśli wolicie naśladować istniejącą już grę — też tak zróbce! Najlepszym sposobem nauki jest próbowanie!




