Rozwój gier z Godot 🤖

Skip to content

To jest tłumaczenie maszynowe, które 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:

Co z grafiką, muszę ją sam tworzyć?

Nie! Możecie znaleźć wiele darmowych zasobów tutaj:

Inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne

Inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne

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 pobrać Godot?

Możesz pobrać Godot z:

Po prostu pobierz i zainstaluj (lub uruchom na Steam).

Ustaw projekt!

Po uruchomieniu Godot pojawia się to okno:

Godot Projekt

Tutaj pytano o język programowania, GDScript lub C#. GDScript jest bardzo podobny do Pythona.

Różnice między GDScript a Python (bez kolorów):

def hello():
    text = "Hello world!"

    print(text)
func hello():
    var text = "Hello world!"

    print(text)

Dla zmiennych w Pythonie wystarczy wpisać tylko nazwę zmiennej. W GDScript musisz najpierw wpisać var. Aby tworzyć funkcje, piszesz func zamiast def.

Sceny i Węzły

Jednym z najważniejszych koncepcji w Godot są Sceny i Węzły. Możemy zacząć od węzłów. Węzeł to obiekt w Godot, i może przedstawiać wszystko. Może to być coś, co przedstawia gracza, wroga, przycisk w menu, tekst na ekranie, wszystko możliwe. Sceny to kolekcja węzłów.

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

Utwórz scenę

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:

Obecna scena

Część 1b - Naprawa ⚠️ na CollisioShape2D

Trójkąt ostrzegawczy w tym przypadku oznacza, że CollisioShape2D nie ma faktycznej kolizji. Możesz to naprawić, naciskając na węzeł (po lewej stronie), wtedy pojawi się panel po prawej stronie. Tutaj otrzymasz wiele informacji o węźle, które możesz zmienić. Śmiało eksperymentuj z tym, co tam jest. Ale skupimy się na “Shape”, ustaw go na przykład na RectangleShape2D. To nie jest tak bardzo ważne, nie będziemy używać kolizji tutaj.

Część 1c - Dodawanie Spritu, grafiki

Jeśli klikniesz na Sprite2D po lewej stronie, pojawi się pole po prawej, w którym znajduje się napis “Texture”. Tutaj możesz wstawić obraz dla gracza. Wystarczy przeciągnąć obraz i upuścić go w polu.

Tak będzie wyglądać po dodaniu sprinta.

Menu sprinta

Część 2 - Dodawanie inputu, kontroler

Na górze okna znajduje się menu “Scene - Project - Debug - Editor - Help”. Kliknij “Project” a następnie “Project Settings”. Tutaj pojawi się menu z wieloma ustawieniami. Kliknij “Input Map”. Tutaj możecie ustawić przyciski na klawiaturze.

  • W polu “Add New Action” wpisz “left” a następnie kliknij “Add”.
  • Następnie dodaj “right”, “up” i “down”.
  • Te zostaną oznaczone jako “Actions”
  • Do każdej “Action” możecie dodać przyciski, klikając przycisk + po prawej stronie.

Przycisk plus

  • Tutaj wystarczy kliknąć na klawiaturze, a następnie kliknąć Add.
  • Dodaj przyciski do wszystkich actions.

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)

Przycisk Attach script

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

extends CharacterBody2D

# Dette er en enkel karakterkontroller
# This is a simple character controller
# To jest prosty kontroler postaci

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

Proces fizyki?

_physics_process to funkcja, która aktualizowana jest w każdym “frame”, czyli około 60 razy na sekundę (domyślnie). Istnieje inna funkcja, która po prostu nazywa się _process, która aktualizowana jest w całości. Jeśli chcesz, aby gracz poruszał się z równomierną prędkością, użyj _physics_process.

To jest tutaj, gdzie dodamy kod, który przesuwa gracza.

Część 4 - Podstawowe wejście

W części 2 dodałeś przyciski wejściowe, teraz będziemy ich używać. Istnieje wbudowany obiekt o nazwie Input, który możemy wykorzystać do sprawdzenia, czy gracz nacisnął przycisk, który skonfigurowaliśmy w “Input Map”.

Spróbuj wstawić ten kod do _physics_process:

if Input.is_action_pressed('right'):
   # Hvis høyre tasten trykkes, sett x-hastigheten til 100
   # Jeśli wciśnięto prawy przycisk, ustaw prędkość x na 100
   velocity.x = 100

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

Spacje na liniach są bardzo ważne, jest to podobne jak w Pythonie.

Co się dzieje, gdy uruchamiasz program, naciskając przycisk odtwarzania w oknie Godot, a następnie “w prawo”?

Jeśli nic się nie dzieje teraz:

  • Czy pamiętałeś, żeby coś ustawić w “Mapie Wejścia”?
  • Czy napisałeś w prawo a nie W prawo? Czyli, to co napisałeś w kodzie jest takie samo jak nazwa w mapie wejścia?

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.

Cały kod teraz
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    velovity = 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ły kod na końcu z const
extends CharacterBody2D

const SPEED = 100

func _physics_process(delta: float) -> void:
    velocity = 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 - Zabawa samemu!

Jeśli wrócicie do pierwszej części, Przydatne Zasoby, możecie znaleźć, czym możecie dalej się bawić.

Następnie możecie spróbować stworzyć własną grę. Co stworzycie, zależy od Was! Jeśli chcecie stworzyć coś zupełnie nowego, róbcie to! Jeśli chcecie spróbować naśladować grę, która już istnieje, róbcie to! Najlepszym sposobem na naukę jest próbowanie!