Nastoletni
Programiści

Logo Nastoletnich Programistów

Battle City Clone – Godot

Prosto i bez zbędnego rozwijania. Klon znanej raczej każdemu gry na kultowego kiedyś pegasusa  – Battle City –  lub także pod nazwą – Tank 1990. Wykonany on zostanie w open source’owym oraz darmowym silniku jakim jest Godot Engine.

Całość znajduje się na repo https://github.com/Vunnysher/GodotBattleCity – ( 01_Movement )

Sterowanie czołgiem

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.

Vunnysher

Lubie robić gry, ale jeszcze nie zrobiłem żadnej.

Zobacz wszystkie posty tego autora →

Komentarze

  • Aleksandra Rutkowska

    Twoje poradniki są przydatne! Mam do ciebie pytanie…
    Bo chcę zrobić grę (taką platformo-przygodówkę typu Rayman Origins) i czy wiesz jak dodać animację do obiektu?