Całość znajduje się na repo /Vunnysher/GodotBattleCity – ( 01_Movement )
Postaram się odwzorować sterowanie czołgiem używając do tego godotowej fizyki.
Zaczynając, oczywiście tworzę czysty projekt.
Oraz skorzystam z oryginalnych assetów z Battle City. Poniżej źródła:
Z tekstur usunę niepotrzebne tło w gimpie i zostawię przeźroczyste. Dodaję nową warstwę przeźroczystą, ustawiam ją na samym dole. Kopiuję całą zawartość na przeźroczystą warstwę, a starą usuwam. Następnie zaznaczam Różdżką wybrany kolor (w tym przypadku turkusowy), który chcę usunąć i naciskam Delete.
Tworzę hierarchię KinematicBody2D – Sprite2D
Wchodząc w Inspector Sprite’a, wybieram dla niego teksturę, a następnie używając strzałeczki na prawo od tekstury przechodzę do jej właściwości. Odznaczam wszystkie flagi aby piksele się nie rozmywały.
Wracam do Inspectora Sprite’a i zaznaczam flagę Region . Umożliwia ona wycięcie z tekstury wybranego fragmentu. Niżej w Region Rect ustawiam koordynaty czołgu oraz jego szerokość, która wynosi 13 x 13px. I oto widać pojazd:
Pora zrobić sterowanie. W tym celu najzwyczajniej klikam prawym na KInematicBody2D oraz wybierając z menu Add Script. Tworzę nowy plik i wpisuję podany niżej kod.
set_fixed_process(true)
Uruchamia funkcję _fixed_process , która powtarza się 60 razy na sekundę.
if Input.is_action_pressed("akcja"):
Zwraca
true
lub
false
w zależności od tego czy dany klawisz akcji jest wciśnięty.
self.move(Vector(x,y))
Jest to funkcja przeznaczona dla klasy
KinematicBody
( do siebie odnosimy się poprzez
self
),
przesuwa ona ciało obiektu o daną ilość pikseli na klatkę.
Teraz tylko odrobinę powiększę Sprite z czołgiem, ustawiając mu w Inspector Scale na 4,4.
Jeździć jeździ. Ale jakoś tak… bokiem. Zmienię trochę skrypt, alby wycięty był inny obszar tekstury w zależności od kierunku.
onready var
to zmienna której przypisujemy wartość jeszcze przed rozpoczęciem programu.
get_node("scieżka")
pobiera Node do zmiennej.
set_region_rect(Rect2(x,y,width,height))
to funkcja dla klasy Sprite, która zmienia położenie wycinka z tekstury.
Teraz wygląda to tak:
Przydało by się zanimować poruszanie. Zmieniam więc teksturę na tą drugą ponieważ zawiera ona także klatki poruszania się gąsienic. Zaraz po tym aktualizuję pozycje dla Region Rect w kodzie, oraz dodaję do skryptu kilka nowych rzeczy.
Na sam początek zmienna
frameTime
będzie przechowywała czas dla klatek.
Jeżeli jest mniejszy niż 0.1s to jest jedna klatka, jeżeli większy to druga. Gdy
frameTime
osiągnie 0, nadaję mu wartość 0.2s aby go „zresetować” (ostatnie 2 linijki).
set_rot(rad)
to funkcja dla klasy Node2D która ustawia obiekt pod podanym kątem w radianach. Dlatego tez użyłem funkcji
deg2rad(deg)
która zamienia podane stopnie (degrees) na radiany.
set_flip_h(boolean)
odwraca sprite względem osi poziomej ( horizontal ) – użyłem aby odwrócić czołg odpowiednią stroną naświetlenia.
I dzięki tej aktualizacji kodu używamy tak naprawdę tylko dwóch klatek z tekstury.
Tak to teraz wygląda:
Na razie tyle, możliwe że niedługo będzie dalsza część tworzenia klona Battle City.
]]>
W pierwszej części spróbuję Cię przekonać, dlaczego Godot świetnie się nadaje dla niezależnych developerów gier lub po prostu zabawy w domu.
Na początek chyba najważniejsza rzecz, Godot jest open source na licencji MIT, co daje nam możliwość robienia co nam się podoba, wraz z modyfikacją kodu oraz pisania własnych pluginów. Godot dopiero się rozwija, co nie znaczy że jest daleko w tyle za Unity, a nawet z poziomu 2D jest na tym samym poziomie. Jedynie 3D Godot nadrabia, pisząc od nowa cały system trójwymiaru i cieni.
Skoro 2D ma dobre, to czemu go nie użyć, więc poniżej wypiszę jeszcze podobieństwa oraz różnice Godota z Unity:
Silnik | Unity | Godot |
---|---|---|
Silnik 2D | Brak. Unity 2D to Unity 3D z orthographic kamerą | Jest. Oddzielony od 3D |
Fizyka | Jest. Ciała, jointy etc | Jest. Tak samo jak w Unity |
Shadery | Są | Są |
Wieloplatformowość | Jest, jednak na linuxie czasami występują błędy | Jest. Brak wsparcia na konsole |
Edytor na linuxa | Brak | Jest |
Asset Store | Jest | Jest |
Oraz na koniec jak wygląda Hello World w obydwu silnikach, lecz zamiast Hello World wyświetlimy obrazek.
Tak więc na szybko zrobione wyświetlanie wygląda tak (po lewej Godot, po Prawej Unity):
Teraz przejdziemy do podstaw obsługi Godota.
W pierwszej części poradnika nie zrobimy raczej nic ciekawego, ale dowiemy się jak działa Godot. Jeżeli ktoś korzystał wcześniej z Unity, nie będzie miał z tym większego problemu, poza kilkoma różniącymi się od niego rzeczami.
Najciekawszy jest system użyty w Godocie. Każdy obiekt jest sceną. Dosłownie. To daje bardzo wiele możliwości, które za bardzo nam się na ten moment nie przydadzą.
Godota można pobrać z www.godotengine.org .
Zaczniemy od stworzenia projektu.
Tutaj nie ma wielu rzeczy do tłumaczenia, klikamy New Project i podajemy ścieżkę do folderu, w którym będzie nasz plik projektu wraz z assetami. Otwieramy poprzez dwukrotne kliknięcie lub zaznaczamy projekt i wciskamy Edit .
I mamy nasz edytor.
Idąc panelami:
Pierwszy od góry z lewej, to nasz folder z projektem, a niżej podgląd plików znajdujących się w bieżącym folderze.
Po prawej na górze mamy drzewko nodesów (obiektów), a niżej inspektor bieżącego node’a.
Obiekt – Node
Node’ów jest naprawdę dużo, każdy na wyznaczoną rolę, i są 3 główne typy:
Są także nodesy nadające się do wszystkich tych typów, takie jak AnimationPlayer, Tween i wszystkie inne które znajdziecie poza 3 głównymi typami.
W takim razie wyświetlimy obrazek. Mamy już ikonkę Godota w folderze projektu, więc na razie nie trzeba niczego przygotowywać.
Sceny zazwyczaj powinniśmy zaczynać od pustego node’a, ponieważ może być tylko jeden główny, w Unity można mieć wiele. Wstawimy więc pusty Node2D.
Nad drzewkiem nodesów klikamy plusik i wyskoczy nam okienko z wyborem node’a.
Wybieramy zwykły Node2D.
Teraz gdy mamy zaznaczony nasz główny node, naciskamu plusik aby podpiąć jakiegoś node’a pod niego. Dodamy więc Sprite ( nie Sprite3D). Jeżeli masz problem ze znalezieniem użyj paska wyszukiwarki.
Naciskamy na Sprite i idziemy do inspektora node’a, który znajduje się na niższym panelu.
Są tutaj wartości które są dostępne dla wszystkich nodesów z danej kategorii (np. Node2D: Pos, Rot, Scale) lub tylko dla danego typu node’a, tak jak tutaj mamy grupę Sprite. Zawiera ona zmienną z teksturą, offset i inne różne duperele. Naciskamy na strzałkę w dół obok „Texture <null>” , klikamy load i wybieramy ikonkę naszego Godota.
I jest on na scenie w pozycji
(0,0)
oraz jest wyśrodkowany gdyż ma zaznaczoną w inskeptorze flagę
centered
.
Po edytorze sceny możemy poruszać się za pomocą środkowego kółka myszy, zoom in/out trzymając Ctrl+kółko myszy, a do manipulacji nodesami mamy 3 narzędzia:
Więc możemy sobie naszego sprite’a przesunąć oraz zeskalować:
E to izi, tam taka szczałka jest u góry.
No niestety wywali nam pop-upa, że scena jest nie zapisana. Możemy ją zapisać wchodząc w lewym górnym rogu w Scene -> save scene lub przy tym komunikacie wcisnąć Yes . Zapiszmy scenę pod nazwą mainscene.tscn .
Teraz jest zapisana, ale dalej mu coś nie pasi, bo znowu coś wywala przy próbie włączenia. Godot potrzebuje Głównej sceny , którą będzie uruchamiał przy każdym włączeniu gry. Możemy odpalić aktualnie wybraną scenę, naciskając tą ikonkę:
Lecz aby ustawić główną scenę, możemy wcisnąć select na pop-upie, który nam wyskoczy przy próbie włączenia gry normalną strzałką, tą z samej lewej strony, lub wejść w Scene -> Project Settings .
Tutaj znajdziemy wszystkie dane dotyczące naszego projektu. W zakładce „Application”, po prawej jest zmienna main_scene. Aby wybrać główną scenę naciskamy na ikonkę folderu, i podajemy ścieżkę do sceny. Teraz możemy odpalić grę.
To tyle w pierwszej części poradnika. Omówiłem tu najważniejsze rzeczy w edytorze poza skryptami, czym zajmę się w następnej części, w której napiszemy poruszanie się w 4 kierunkach.
]]>